Seseorang tolong jelaskan perbedaan antara java.lang.RuntimeException
dan java.lang.Exception
? Bagaimana cara memutuskan mana yang akan diperpanjang jika saya membuat pengecualian sendiri?
210
Umumnya RuntimeExceptions adalah pengecualian yang dapat dicegah secara program. Misalnya NullPointerException
, ArrayIndexOutOfBoundException
. Jika Anda memeriksa null
sebelum memanggil metode apa pun, NullPointerException
tidak akan pernah terjadi. Demikian pula ArrayIndexOutOfBoundException
tidak akan pernah terjadi jika Anda memeriksa indeks terlebih dahulu.RuntimeException
tidak diperiksa oleh kompiler, jadi itu adalah kode bersih.
EDIT : Hari-hari ini orang menyukai RuntimeException
karena kode bersih yang dihasilkannya. Ini benar-benar pilihan pribadi.
RuntimeException
adalah karena itu sederhana, dan menyingkirkan kebutuhan untuk memikirkan perbedaan antara pengecualian yang diperiksa dan yang tidak dicentang. Saya pikir menangkap pengecualian runtime adalah ide yang buruk karena Anda akan menangkap pengecualian yang tidak dapat dipulihkan sepertiNullPointerException
.Di Jawa, ada dua jenis pengecualian: pengecualian diperiksa dan pengecualian tidak diperiksa. Pengecualian yang diperiksa harus ditangani secara eksplisit oleh kode, sedangkan pengecualian yang tidak dicentang tidak perlu ditangani secara eksplisit.
Untuk pengecualian yang dicentang, Anda harus meletakkan blok coba / tangkap di sekitar kode yang berpotensi melempar pengecualian, atau menambahkan klausa "melempar" ke metode, untuk menunjukkan bahwa metode tersebut mungkin membuang jenis pengecualian ini (yang harus ditangani di kelas panggilan atau di atas).
Setiap pengecualian yang berasal dari "Pengecualian" adalah pengecualian yang diperiksa, sedangkan kelas yang berasal dari RuntimeException tidak dicentang. RuntimeExceptions tidak perlu ditangani secara eksplisit oleh kode panggilan.
sumber
Sebelum melihat perbedaan antara
java.lang.RuntimeException
danjava.lang.Exception
kelas, Anda harus mengetahuiException
hierarki. KeduanyaException
danError
kelas berasal dari kelasThrowable
(yang berasal dari kelasObject
). Dan kelasRuntimeException
tersebut berasal dari kelasException
.Semua pengecualian berasal dari
Exception
atauRuntimeException
.Semua pengecualian yang berasal dari
RuntimeException
disebut sebagai pengecualian yang tidak dicentang . Dan semua pengecualian lainnya diperiksa . Pengecualian diperiksa harus ditangkap di suatu tempat dalam kode Anda, jika tidak, itu tidak akan dikompilasi. Itu sebabnya mereka disebut pengecualian diperiksa. Di sisi lain, dengan pengecualian yang tidak dicentang, metode panggilan tidak berkewajiban untuk menangani atau menyatakannya.Oleh karena itu, semua pengecualian yang memaksa kompiler untuk Anda tangani berasal langsung
java.lang.Exception
dan semua kompilator lain yang tidak memaksa Anda untuk menangani berasal darijava.lang.RuntimeException
.Berikut adalah beberapa subclass langsung yang dikenal dari RuntimeException .
sumber
Pengecualian dicentang, dan RuntimeException tidak dicentang.
Dicentang berarti bahwa kompiler mengharuskan Anda menangani pengecualian dalam tangkapan, atau menyatakan metode Anda sebagai melemparkannya (atau salah satu dari kacamata supernya).
Secara umum, lemparkan pengecualian yang diperiksa jika pemanggil API diharapkan untuk menangani pengecualian, dan pengecualian yang tidak dicentang jika itu adalah sesuatu yang biasanya tidak bisa ditangani oleh pemanggil, seperti kesalahan dengan salah satu parameter, yaitu pemrograman kesalahan.
sumber
Kelas pengecualian runtime (RuntimeException dan subkelasnya) dikecualikan dari pengecekan waktu kompilasi, karena kompiler tidak dapat menetapkan bahwa pengecualian run-time tidak dapat terjadi. (dari JLS).
Di kelas yang Anda desain Anda harus subkelas Pengecualian dan memberikan contoh untuk menandai setiap skenario luar biasa. Dengan melakukan itu, Anda akan secara eksplisit memberi sinyal kepada klien kelas Anda bahwa penggunaan kelas Anda dapat menimbulkan pengecualian dan mereka harus mengambil langkah-langkah untuk menangani skenario luar biasa itu.
Cuplikan kode di bawah ini menjelaskan hal ini:
Dalam definisi kelas atas Proses kelas , metode ini
execute
dapat melempar RuntimeException tetapi deklarasi metode tidak perlu menentukan bahwa ia melempar RuntimeException .Metode
process
melempar pengecualian yang diperiksa dan harus menyatakan bahwa ia akan membuang pengecualian yang diperiksa dari jenis MyException dan tidak melakukannya akan menjadi kesalahan kompilasi.Definisi kelas di atas akan mempengaruhi kode yang menggunakan kelas Proses juga.
Panggilan
new Process().execute()
adalah doa yang valid di mana sebagai panggilan formulirnew Process().process()
memberikan kesalahan kompilasi. Ini karena kode klien harus mengambil langkah-langkah untuk menanganiMyException
(katakan ajakan untuk memproses () dapat dilampirkan dalam blok coba / tangkap).sumber
Penggunaan RuntimeException dengan benar?
Dari Pengecualian Tidak Dicentang - Kontroversi :
Perhatikan bahwa pengecualian yang tidak dicentang adalah yang berasal dari
RuntimeException
dan pengecualian yang diperiksa adalah yang berasal dariException
.Mengapa melempar
RuntimeException
jika klien tidak dapat melakukan apa pun untuk memulihkan dari pengecualian? Artikel tersebut menjelaskan:sumber
Dari dokumentasi oracle:
Pengecualian runtime mewakili masalah yang merupakan hasil dari masalah pemrograman dan karena itu, kode klien API tidak dapat diharapkan untuk pulih dari mereka atau untuk menanganinya dengan cara apa pun.
Contoh RuntimeExceptions seperti "pengecualian oleh penggunaan api yang tidak valid" contoh runtimeexeption: IllegalStateException, NegativeArraySizeException, NullpointerException
Dengan Pengecualian Anda harus menangkapnya secara eksplisit karena Anda masih dapat melakukan sesuatu untuk pulih. Contoh Pengecualian adalah: IOException, TimeoutException, PrintException ...
sumber
Dengan kata sederhana, jika klien / pengguna Anda dapat memulihkan dari Pengecualian maka jadikan itu Pengecualian Tercatat , jika klien Anda tidak dapat melakukan apa pun untuk memulihkan dari Pengecualian, maka buatlah itu Tidak Dicentang RuntimeException . Misalnya, RuntimeException akan menjadi kesalahan terprogram, seperti pembagian dengan nol, tidak ada pengguna yang dapat melakukan apa pun kecuali programmer itu sendiri, maka itu adalah RuntimeException .
sumber
RuntimeException adalah kelas anak dari kelas Exception
Ini adalah salah satu dari banyak kelas anak dari kelas Pengecualian. RuntimeException adalah superclass dari pengecualian yang dapat dilempar selama operasi normal Java Virtual Machine. Metode tidak diharuskan untuk mendeklarasikan dalam klausa throwsnya subclass apa pun dari RuntimeException yang mungkin dilemparkan selama eksekusi metode tetapi tidak tertangkap.
Hirarki itu
java.lang.Object
--- java.lang.Terima kasih
------- java.lang.Exception
------------- java.lang.RuntimeException
sumber
Pengecualian adalah cara yang baik untuk menangani peristiwa tak terduga dalam aliran aplikasi Anda. RuntimeException tidak dicentang oleh Compiler tetapi Anda dapat memilih untuk menggunakan Pengecualian yang memperluas Kelas Pengecualian untuk mengontrol perilaku klien api Anda karena mereka diharuskan untuk menangkap kesalahan yang harus dikompilasi oleh mereka. Juga membentuk dokumentasi yang bagus.
Jika ingin mencapai antarmuka yang bersih, gunakan pewarisan untuk mensubklasifikasikan berbagai jenis pengecualian yang dimiliki aplikasi Anda dan kemudian paparkan pengecualian induk.
sumber
Ada dua jenis pengecualian, Anda dapat memulihkan dari pengecualian yang diperiksa jika Anda mendapatkan pengecualian semacam itu. Pengecualian runtime tidak dapat dipulihkan, pengecualian runtime adalah kesalahan pemrograman, dan programmer harus menanganinya saat menulis kode, dan melanjutkan eksekusi ini mungkin memberi Anda hasil yang salah. Pengecualian runtime adalah tentang melanggar prasyarat ex. Anda memiliki array ukuran 10, dan Anda mencoba mengakses elemen ke-11, ia akan membuang ArrayIndexOutOfBoundException
sumber
Pengecualian yang Ditentukan Pengguna dapat Diperiksa Pengecualian atau Pengecualian tidak dicentang, Itu tergantung pada kelas yang diperluas.
Pengecualian yang Ditentukan Pengguna dapat Pengecualian Khusus, jika diperluas ke kelas Pengecualian
Pengecualian yang Ditentukan Pengguna dapat Pengecualian Tidak Dicustom, jika diperluas ke kelas Run time Exception.
Tentukan kelas dan buat anak itu menjadi Pengecualian atau Berlari waktu
sumber