Bagaimana cara membuat pengecualian khusus di Java? [Tutup]

149

Bagaimana cara membuat pengecualian khusus di Java?

Suresh Chaganti
sumber
2
Ini adalah metodologi yang sama yang digunakan dalam sebagian besar bahasa OO: memperpanjang kelas dasar Pengecualian.
NDM
1) // Kelas yang mewakili kelas expeception yang ditentukan penggunaan MyException memperluas Exception {public MyException (String s) {super (s); }} ------------------------------------------------ 2) coba {// Lempar objek pengecualian yang ditentukan pengguna lempar MyException baru ("TestException"); } catch (MyException ex) {System.out.println ("Tertangkap"); // Cetak pesan dari objek MyException System.out.println (ex.getMessage ()); }
Mandeep Yadav

Jawaban:

285

Untuk mendefinisikan pengecualian yang dicentang, Anda membuat subclass (atau hierarki subclass) dari java.lang.Exception. Sebagai contoh:

public class FooException extends Exception {
  public FooException() { super(); }
  public FooException(String message) { super(message); }
  public FooException(String message, Throwable cause) { super(message, cause); }
  public FooException(Throwable cause) { super(cause); }
}

Metode yang berpotensi melempar atau menyebarkan pengecualian ini harus menyatakannya:

public void calculate(int i) throws FooException, IOException;

... dan pemanggilan kode metode ini harus menangani atau menyebarkan pengecualian ini (atau keduanya):

try {
  int i = 5;
  myObject.calculate(5);
} catch(FooException ex) {
  // Print error and terminate application.
  ex.printStackTrace();
  System.exit(1);
} catch(IOException ex) {
  // Rethrow as FooException.
  throw new FooException(ex);
}

Anda akan melihat dalam contoh di atas yang IOExceptionditangkap dan diposisikan ulang sebagai FooException. Ini adalah teknik umum yang digunakan untuk merangkum pengecualian (biasanya ketika menerapkan API).

Terkadang akan ada situasi di mana Anda tidak ingin memaksa setiap metode untuk menyatakan implementasi pengecualian Anda dalam klausa lemparannya. Dalam hal ini Anda dapat membuat pengecualian yang tidak dicentang . Pengecualian yang tidak dicentang adalah pengecualian yang meluas java.lang.RuntimeException(yang merupakan subkelas dari java.lang.Exception):

public class FooRuntimeException extends RuntimeException {
  ...
}

Metode dapat melempar atau menyebarkan FooRuntimeExceptionpengecualian tanpa menyatakannya; misalnya

public void calculate(int i) {
  if (i < 0) {
    throw new FooRuntimeException("i < 0: " + i);
  }
}

Pengecualian yang tidak dicentang biasanya digunakan untuk menunjukkan kesalahan programmer, misalnya meneruskan argumen yang tidak valid ke metode atau mencoba untuk melanggar batas indeks array.

The java.lang.Throwablekelas adalah akar dari semua kesalahan dan pengecualian yang dapat dibuang di Jawa. java.lang.Exceptiondan java.lang.Errorkeduanya adalah subclass dari Throwable. Apa pun yang subclass Throwablemungkin dibuang atau ditangkap. Namun, biasanya praktik yang buruk untuk ditangkap atau dilempar Errorkarena ini digunakan untuk menunjukkan kesalahan internal pada JVM yang biasanya tidak dapat "ditangani" oleh programmer (misalnya OutOfMemoryError). Demikian juga Anda harus menghindari penangkapan Throwable, yang dapat menyebabkan Anda menangkap Errorselain Exception.

Adamski
sumber
25
public class MyException extends Exception {
        // special exception code goes here
}

Lemparkan sebagai:

 throw new MyException ("Something happened")

Tangkap sebagai:

catch (MyException e)
{
   // something
}
laura
sumber
4

Untuk pengecualian yang diperiksa:

public class MyCustomException extends Exception { }

Secara teknis, apa pun yang meluas Throwabledapat dilempar, tetapi pengecualian umumnya ekstensi Exceptionkelas sehingga mereka memeriksa pengecualian (kecuali RuntimeException atau kelas berdasarkan itu, yang tidak dicentang), yang bertentangan dengan jenis umum lainnya yang bisa dibuang, Errors yang biasanya bukan sesuatu yang dirancang untuk ditangani dengan anggun di luar internal JVM.

Anda juga dapat membuat pengecualian non-publik, tetapi kemudian Anda hanya dapat menggunakannya dalam paket yang mendefinisikannya, sebagai lawan dari seluruh paket.

Sejauh melempar / menangkap pengecualian kustom, ini berfungsi seperti yang ada di dalamnya - melempar melalui

throw new MyCustomException()

dan menangkap

catch (MyCustomException e) { }
Amber
sumber
4
RuntimeException memperluas Pengecualian dan bukan pengecualian yang diperiksa.
Adamski
2
Secara teknis, apa pun yang meluas Throwabledapat dibuang ; pengecualian meluas Exception. Subkelas kustom Throwable tidak akan ditangkap oleh try { ... } catch (Exception e) { ... }blok.
Andrzej Doyle
Mengapa orang tidak mendukung jawaban ini? Ini berisi beberapa ketidakakuratan. 1) Anda tidak dapat menggunakan implmenet karena ini merupakan antarmuka. 2) Apa pun yang memperluas Throwable BUKAN pengecualian ( Errorbukan pengecualian, ini kesalahan). 3) Ini menyiratkan bahwa setiap subkelas Pengecualian diperiksa sedangkan RuntimeException tidak. Jawaban yang diberikan oleh Adamski jauh lebih akurat!
oxbow_lakes
Ups - maksud saya throwable bukan antarmuka tentu saja!
oxbow_lakes
@oxbow_lakes - solusi ideal adalah untuk memperbaiki ketidakakuratan, bukan? Bagaimanapun, saya telah mengoreksi mereka sendiri karena tidak ada orang lain yang melakukannya.
Amber