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:
... 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.thrownewFooException(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):
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.
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
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.
Jawaban:
Untuk mendefinisikan pengecualian yang dicentang, Anda membuat subclass (atau hierarki subclass) dari
java.lang.Exception
. Sebagai contoh:Metode yang berpotensi melempar atau menyebarkan pengecualian ini harus menyatakannya:
... dan pemanggilan kode metode ini harus menangani atau menyebarkan pengecualian ini (atau keduanya):
Anda akan melihat dalam contoh di atas yang
IOException
ditangkap dan diposisikan ulang sebagaiFooException
. 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 darijava.lang.Exception
):Metode dapat melempar atau menyebarkan
FooRuntimeException
pengecualian tanpa menyatakannya; misalnyaPengecualian 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.Throwable
kelas adalah akar dari semua kesalahan dan pengecualian yang dapat dibuang di Jawa.java.lang.Exception
danjava.lang.Error
keduanya adalah subclass dariThrowable
. Apa pun yang subclassThrowable
mungkin dibuang atau ditangkap. Namun, biasanya praktik yang buruk untuk ditangkap atau dilemparError
karena ini digunakan untuk menunjukkan kesalahan internal pada JVM yang biasanya tidak dapat "ditangani" oleh programmer (misalnyaOutOfMemoryError
). Demikian juga Anda harus menghindari penangkapanThrowable
, yang dapat menyebabkan Anda menangkapError
selainException
.sumber
Lemparkan sebagai:
Tangkap sebagai:
sumber
Untuk pengecualian yang diperiksa:
Secara teknis, apa pun yang meluas
Throwable
dapat dilempar, tetapi pengecualian umumnya ekstensiException
kelas sehingga mereka memeriksa pengecualian (kecuali RuntimeException atau kelas berdasarkan itu, yang tidak dicentang), yang bertentangan dengan jenis umum lainnya yang bisa dibuang,Error
s 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
dan menangkap
sumber
Throwable
dapat dibuang ; pengecualian meluasException
. Subkelas kustom Throwable tidak akan ditangkap olehtry { ... } catch (Exception e) { ... }
blok.Error
bukan pengecualian, ini kesalahan). 3) Ini menyiratkan bahwa setiap subkelas Pengecualian diperiksa sedangkan RuntimeException tidak. Jawaban yang diberikan oleh Adamski jauh lebih akurat!