Saya mencoba mempelajari lebih lanjut tentang Java dasar dan berbagai jenis Throwables, dapatkah seseorang memberi tahu perbedaan antara Pengecualian dan Kesalahan?
Saya mencoba mempelajari lebih lanjut tentang Java dasar dan berbagai jenis Throwables, dapatkah seseorang memberi tahu perbedaan antara Pengecualian dan Kesalahan?
Jawaban:
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
...Slide ini menunjukkan hierarki pengecualian Java oleh @ georgios-gousios secara ringkas menjelaskan perbedaan antara Kesalahan dan Pengecualian di Jawa.
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.
Error
s di java adalah tipe java.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
Exception
s di java adalah tipe java.lang.Exception
.Exception
Termasuk kedua jenis yang dicentang dan tidak dicentang.try-catch
blokir.Exception
terutama disebabkan oleh aplikasi itu sendiri.SQLException
, IOException
ArrayIndexOutOfBoundException
, ClassCastException
,NullPointerException
bacaan lebih lanjut: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
Sun mengatakannya dengan baik :
Sebuah Kesalahan adalah subkelas Throwable yang menunjukkan masalah serius yang tidak boleh ditangkap oleh aplikasi yang masuk akal.
Deskripsi Error
kelasnya cukup jelas:
An
Error
adalah subkelas dariThrowable
yang mengindikasikan masalah serius yang tidak boleh ditangkap oleh aplikasi yang masuk akal. Sebagian besar kesalahan tersebut adalah kondisi abnormal. TheThreadDeath
kesalahan, meskipun kondisi "normal", juga subclass dariError
karena sebagian besar aplikasi tidak harus mencoba untuk menangkapnya.Suatu metode tidak diperlukan untuk menyatakan dalam klausa pelemparannya setiap subclass dari
Error
yang mungkin dilemparkan selama pelaksanaan metode tetapi tidak tertangkap, karena kesalahan ini adalah kondisi abnormal yang seharusnya tidak pernah terjadi.
Dikutip dari dokumentasi kelasError
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.
Ada beberapa persamaan dan perbedaan antara kelas java.lang.Exception
dan java.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 menggunakan throws
kata kunci. Deklarasi semacam itu hanya diperlukan untuk java.lang.Exception
dan subkelas, untuk java.lang.Throwable
, java.lang.Error
dan java.lang.RuntimeException
dan subkelas mereka, merupakan opsional.
Hanya java.lang.Throwable
dan subkelas yang diizinkan untuk digunakan dalam catch
klausa.
Hanya java.lang.Throwable
dan subkelas yang dapat digunakan dengan kata kunci - throw
.
Kesimpulan dari properti ini mengikuti keduanya java.lang.Error
dan java.lang.Exception
dapat dideklarasikan di header metode, bisa dalam catch
klausa, dapat digunakan dengan kata kunci throw
.
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 halnya java.lang.Throwable
penerus lainnya ).
Sebuah bagian dari deskripsi javadoc tentang java.lang.Error
:
... menunjukkan masalah serius yang tidak boleh ditangkap oleh aplikasi yang masuk akal.
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
:
... menunjukkan kondisi yang mungkin ingin ditangkap oleh aplikasi yang masuk akal.
java.lang.Error
dan java.lang.Exception
yang pertama dianggap sebagai pengecualian yang tidak dicentang untuk pemeriksaan pengecualian waktu kompilasi. Karena kode hasil melempar java.lang.Error
atau subkelasnya tidak perlu menyatakan kesalahan ini di header metode. Sambil melempar java.lang.Exception
deklarasi yang diperlukan di header metode.Throwable dan diagram kelas penggantinya (properti dan metode dihilangkan).
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.
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.
Berikut ringkasan yang cukup bagus dari Java API yang diwakili oleh Kesalahan dan Pengecualian:
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. Kesalahan ThreadDeath, meskipun kondisi "normal", juga merupakan subkelas Kesalahan karena sebagian besar aplikasi tidak boleh mencoba untuk menangkapnya.
Suatu metode tidak diperlukan untuk menyatakan dalam klausa pelemparannya setiap subkelas Kesalahan yang mungkin dilemparkan selama pelaksanaan metode tetapi tidak ditangkap, karena kesalahan ini adalah kondisi abnormal yang seharusnya tidak pernah terjadi.
OTOH, untuk Pengecualian, Java API mengatakan:
Pengecualian kelas dan subkelasnya adalah bentuk Throwable yang menunjukkan kondisi yang mungkin ingin ditangkap oleh aplikasi yang masuk akal.
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 atau StackOverflowError
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.
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/… .