Bagaimana cara membuat pengecualian khusus di Java?
Bagaimana cara membuat pengecualian khusus di Java?
Jawaban:
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.
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) { }
Throwabledapat dibuang ; pengecualian meluas Exception. Subkelas kustom Throwable tidak akan ditangkap oleh try { ... } catch (Exception e) { ... }blok.
Errorbukan pengecualian, ini kesalahan). 3) Ini menyiratkan bahwa setiap subkelas Pengecualian diperiksa sedangkan RuntimeException tidak. Jawaban yang diberikan oleh Adamski jauh lebih akurat!