Saya mencoba mempelajari lebih lanjut tentang Java dasar dan berbagai jenis Throwables, dapatkah seseorang memberi tahu perbedaan antara Pengecualian dan Kesalahan?
173
Kesalahan tidak boleh ditangkap atau ditangani (kecuali dalam kasus yang paling jarang terjadi). Pengecualian adalah roti dan mentega dari penanganan pengecualian. The Javadoc menjelaskan dengan baik:
Sebuah Kesalahan adalah subkelas Throwable yang menunjukkan masalah serius yang tidak boleh ditangkap oleh aplikasi yang masuk akal. Sebagian besar kesalahan tersebut adalah kondisi abnormal.
Lihatlah beberapa subclass dari Error
, mengambil beberapa komentar JavaDoc mereka:
AnnotationFormatError
- Dilemparkan ketika pengurai penjelasan mencoba membaca anotasi dari file kelas dan menentukan bahwa anotasi tersebut salah bentuk.AssertionError
- Dilemparkan untuk menunjukkan bahwa pernyataan telah gagal.LinkageError
- Subclass dari LinkageError menunjukkan bahwa suatu kelas memiliki ketergantungan pada kelas lain; Namun, kelas yang terakhir telah berubah secara tidak kompatibel setelah kompilasi dari kelas yang sebelumnya.VirtualMachineError
- Dilemparkan untuk menunjukkan bahwa Java Virtual Machine rusak atau telah kehabisan sumber daya yang diperlukan untuk terus beroperasi. Sebenarnya ada tiga subkategori penting Throwable
:
Error
- Sesuatu yang cukup parah telah salah, sebagian besar aplikasi harus crash daripada mencoba untuk menangani masalah,RuntimeException
) - Sangat sering terjadi kesalahan pemrograman seperti NullPointerException
argumen yang ilegal. Aplikasi terkadang dapat menangani atau memulihkan dari Throwable
kategori ini - atau setidaknya menangkapnya di metode Thread run()
, mencatat keluhan, dan terus berjalan.FileNotFoundException
dan TimeoutException
...
Unchecked exceptions != RuntimeExceptions
;Unchecked exceptions = RuntimeExceptions + Errors
. Saya tahu itu menimbulkan pertanyaan: Apakah kesalahan merupakan pengecualian? , tapi ini yang mereka tulis. Berikut adalah salah satu contohnya: docs.oracle.com/javase/tutorial/essential/exceptions/… .Slide ini menunjukkan hierarki pengecualian Java oleh @ georgios-gousios secara ringkas menjelaskan perbedaan antara Kesalahan dan Pengecualian di Jawa.
sumber
Kesalahan cenderung memberi sinyal pada akhir aplikasi Anda seperti yang Anda tahu. Biasanya tidak dapat dipulihkan dari dan menyebabkan VM Anda keluar. Menangkapnya tidak boleh dilakukan kecuali untuk mencatat atau menampilkan dan pesan yang sesuai sebelum keluar.
Contoh: OutOfMemoryError - Tidak banyak yang dapat Anda lakukan karena program Anda tidak dapat lagi berjalan.
Pengecualian seringkali dapat dipulihkan dan bahkan jika tidak, umumnya hanya berarti operasi yang dicoba gagal, tetapi program Anda masih dapat melanjutkan.
Contoh: IllegalArgumentException - Melewati data yang tidak valid ke metode sehingga panggilan metode gagal, tetapi itu tidak mempengaruhi operasi di masa depan.
Ini adalah contoh sederhana, dan ada banyak informasi lain hanya tentang Pengecualian saja.
sumber
Kesalahan -
Error
s di java adalah tipejava.lang.Error
.Error
Terjadi pada saat run time. Mereka tidak akan diketahui dikompilasi.Error
s sebagian besar disebabkan oleh lingkungan di mana aplikasi berjalan.java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Pengecualian -
Exception
s di java adalah tipejava.lang.Exception
.Exception
Termasuk kedua jenis yang dicentang dan tidak dicentang.try-catch
blokir.Exception
terutama disebabkan oleh aplikasi itu sendiri.SQLException
,IOException
Pengecualian dicentang:
ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
bacaan lebih lanjut: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
sumber
Sun mengatakannya dengan baik :
sumber
Deskripsi
Error
kelasnya cukup jelas:Dikutip dari dokumentasi kelas
Error
Java sendiri .Singkatnya, Anda tidak boleh menangkap
Error
, kecuali Anda memiliki alasan yang bagus untuk melakukannya. (Misalnya untuk mencegah implementasi server web Anda mogok jika servlet kehabisan memori atau sesuatu seperti itu.)Exception
Sebaliknya, An hanyalah pengecualian normal seperti pada bahasa modern lainnya. Anda akan menemukan deskripsi terperinci dalam dokumentasi Java API atau sumber daya online atau offline.sumber
Ada beberapa persamaan dan perbedaan antara kelas
java.lang.Exception
danjava.lang.Error
.Kesamaan:
Pertama - kedua kelas meluas
java.lang.Throwable
dan sebagai hasilnya mewarisi banyak metode yang umum digunakan ketika berhadapan dengan kesalahan seperti:getMessage
,getStackTrace
,printStackTrace
dan sebagainya.Kedua, sebagai subclass dari
java.lang.Throwable
keduanya mewarisi properti berikut:Throwable sendiri dan semua subkelasnya (termasuk
java.lang.Error
) dapat dideklarasikan dalam daftar pengecualian metode menggunakanthrows
kata kunci. Deklarasi semacam itu hanya diperlukan untukjava.lang.Exception
dan subkelas, untukjava.lang.Throwable
,java.lang.Error
danjava.lang.RuntimeException
dan subkelas mereka, merupakan opsional.Hanya
java.lang.Throwable
dan subkelas yang diizinkan untuk digunakan dalamcatch
klausa.Hanya
java.lang.Throwable
dan subkelas yang dapat digunakan dengan kata kunci -throw
.Kesimpulan dari properti ini mengikuti keduanya
java.lang.Error
danjava.lang.Exception
dapat dideklarasikan di header metode, bisa dalamcatch
klausa, dapat digunakan dengan kata kuncithrow
.Perbedaan:
Perbedaan konseptual pertama:
java.lang.Error
dirancang untuk dilemparkan oleh JVM dan menunjukkan masalah serius dan dimaksudkan untuk menghentikan pelaksanaan program alih-alih tertangkap (tetapi dimungkinkan seperti halnyajava.lang.Throwable
penerus lainnya ).Sebuah bagian dari deskripsi javadoc tentang
java.lang.Error
:Sebaliknya
java.lang.Exception
dirancang untuk mewakili kesalahan yang diharapkan dan dapat ditangani oleh seorang programmer tanpa menghentikan eksekusi program.Sebuah bagian dari deskripsi javadoc tentang
java.lang.Exception
:java.lang.Error
danjava.lang.Exception
yang pertama dianggap sebagai pengecualian yang tidak dicentang untuk pemeriksaan pengecualian waktu kompilasi. Karena kode hasil melemparjava.lang.Error
atau subkelasnya tidak perlu menyatakan kesalahan ini di header metode. Sambil melemparjava.lang.Exception
deklarasi yang diperlukan di header metode.Throwable dan diagram kelas penggantinya (properti dan metode dihilangkan).
sumber
IMO kesalahan adalah sesuatu yang dapat menyebabkan aplikasi Anda gagal dan tidak boleh ditangani. Pengecualian adalah sesuatu yang dapat menyebabkan hasil yang tidak terduga, tetapi dapat dipulihkan dari.
Contoh:
Jika sebuah program kehabisan memori, ini merupakan kesalahan karena aplikasi tidak dapat melanjutkan. Namun, jika suatu program menerima jenis input yang salah, itu merupakan pengecualian karena program dapat menanganinya dan mengarahkan untuk menerima jenis input yang benar.
sumber
Kesalahan terutama disebabkan oleh lingkungan di mana aplikasi sedang berjalan. Sebagai contoh, OutOfMemoryError terjadi ketika JVM kehabisan memori atau StackOverflowError terjadi ketika tumpukan meluap.
Pengecualian terutama disebabkan oleh aplikasi itu sendiri. Misalnya, NullPointerException terjadi ketika aplikasi mencoba mengakses objek nol atau ClassCastException terjadi ketika aplikasi mencoba untuk melemparkan tipe kelas yang tidak kompatibel.
Sumber: Perbedaan Antara Kesalahan Vs Pengecualian Di Jawa
sumber
Berikut ringkasan yang cukup bagus dari Java API yang diwakili oleh Kesalahan dan Pengecualian:
OTOH, untuk Pengecualian, Java API mengatakan:
sumber
Kesalahan disebabkan oleh lingkungan tempat aplikasi atau program Anda berjalan. Sering kali, Anda tidak dapat memulihkannya karena ini mengakhiri aplikasi atau program Anda. Javadoc menyarankan agar Anda tidak perlu repot-repot menangkap kesalahan seperti itu karena lingkungan misalnya JVM, pada kesalahan seperti itu akan berhenti.
Contoh:
VirtualMachineError
- Dilemparkan untuk menunjukkan bahwa Java Virtual Machine rusak atau telah kehabisan sumber daya yang diperlukan untuk terus beroperasi.OutOfMemoryError
terjadi ketika JVM kehabisan memori atauStackOverflowError
terjadi ketika tumpukan habis .Pengecualian disebabkan oleh aplikasi atau program Anda sendiri; mungkin karena kesalahanmu sendiri. Sering kali Anda dapat memulihkannya dan aplikasi Anda masih akan terus berjalan. Anda disarankan untuk menangkap kesalahan seperti itu untuk mencegah penghentian aplikasi atau program Anda yang tidak normal dan / atau untuk dapat menyesuaikan pesan pengecualian sehingga pengguna melihat pesan yang diformat dengan baik alih-alih pesan pengecualian buruk rupa yang tersebar di seluruh tempat.
Contoh:
NullPointerException
terjadi ketika aplikasi mencoba mengakses objek nol. atau Mencoba mengakses array dengan indeks yang tidak ada atau memanggil fungsi dengan data atau parameter yang salah.sumber