Perbedaan antara Pengecualian dan Kesalahan

173

Saya mencoba mempelajari lebih lanjut tentang Java dasar dan berbagai jenis Throwables, dapatkah seseorang memberi tahu perbedaan antara Pengecualian dan Kesalahan?

Marco Leung
sumber

Jawaban:

178

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,
  • Unchecked Exception (alias RuntimeException) - Sangat sering terjadi kesalahan pemrograman seperti NullPointerExceptionargumen yang ilegal. Aplikasi terkadang dapat menangani atau memulihkan dari Throwablekategori ini - atau setidaknya menangkapnya di metode Thread run(), mencatat keluhan, dan terus berjalan.
  • Checked Exception (alias Semuanya) - Aplikasi diharapkan dapat menangkap dan melakukan sesuatu secara bermakna dengan yang lainnya, seperti FileNotFoundExceptiondan TimeoutException...
Eddie
sumber
10
Oracle mengatakan itu 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/… .
ROMANIA_engineer
1
Pertanyaan yang belum terjawab adalah bagaimana perbedaan RuntimeException dan Error pada dasarnya? Keduanya tidak dicentang dan sama dalam segala hal.
Pacerier
38

Slide ini menunjukkan hierarki pengecualian Java oleh @ georgios-gousios secara ringkas menjelaskan perbedaan antara Kesalahan dan Pengecualian di Jawa.

Hierarki Pengecualian Java

avandeursen
sumber
6
Saya akan senang melihat seseorang pulih dari NullPointerException: D: D: D
Ignacio Soler Garcia
2
@IgnacioSolerGarcia Itu bisa dan bahkan masuk akal (pertanyaan lain adalah apakah itu baik). Biasanya Anda memeriksa apakah objek ada dan setelah itu panggil metode atau gunakan bidang. Tapi Anda bisa bukannya memeriksa keberadaannya, coba tangkap NPE saja. Dan catat pesan tentang hal itu dan lanjutkan, misalnya.
Gangnus
@ Gangnus: tidak masuk akal. Ingatlah bahwa pengecualian melewatkan bagian kode dan merupakan cara untuk melaporkan kesalahan, bukan operasi normal
Ignacio Soler Garcia
17

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.

Robin
sumber
Lihatlah contoh.javacodegeeks.com/java-basics/exceptions/… sebagai contoh. IllegalArgumentException adalah pengecualian Runtime, bukan Kesalahan. docs.oracle.com/javase/7/docs/api/java/lang/…
Gangnus
8

Kesalahan -

  1. Errors di java adalah tipe java.lang.Error.
  2. Semua kesalahan di java adalah tipe tidak dicentang.
  3. ErrorTerjadi pada saat run time. Mereka tidak akan diketahui dikompilasi.
  4. Tidak mungkin pulih dari kesalahan.
  5. Errors sebagian besar disebabkan oleh lingkungan di mana aplikasi berjalan.
  6. Contoh: java.lang.StackOverflowError ,java.lang.OutOfMemoryError

Pengecualian -

  1. Exceptions di java adalah tipe java.lang.Exception.
  2. ExceptionTermasuk kedua jenis yang dicentang dan tidak dicentang.
  3. Pengecualian yang dicek diketahui dikompilasi di mana pengecualian yang tidak dicentang tidak diketahui dikompilasi karena mereka terjadi pada saat dijalankan.
  4. Anda dapat memulihkan dari pengecualian dengan menangani mereka melalui try-catchblokir.
  5. Exceptionterutama disebabkan oleh aplikasi itu sendiri.
  6. Contoh: Diperiksa Pengecualian: SQLException, IOException
    Pengecualian dicentang: ArrayIndexOutOfBoundException, ClassCastException,NullPointerException

bacaan lebih lanjut: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

roottraveller
sumber
7

Sun mengatakannya dengan baik :

Sebuah Kesalahan adalah subkelas Throwable yang menunjukkan masalah serius yang tidak boleh ditangkap oleh aplikasi yang masuk akal.

Powerlord
sumber
3

Deskripsi Errorkelasnya cukup jelas:

An Erroradalah subkelas dari Throwable yang mengindikasikan masalah serius yang tidak boleh ditangkap oleh aplikasi yang masuk akal. Sebagian besar kesalahan tersebut adalah kondisi abnormal. The ThreadDeath kesalahan, meskipun kondisi "normal", juga subclass dari Errorkarena sebagian besar aplikasi tidak harus mencoba untuk menangkapnya.

Suatu metode tidak diperlukan untuk menyatakan dalam klausa pelemparannya setiap subclass dari Erroryang 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.)

ExceptionSebaliknya, An hanyalah pengecualian normal seperti pada bahasa modern lainnya. Anda akan menemukan deskripsi terperinci dalam dokumentasi Java API atau sumber daya online atau offline.

Tobias Müller
sumber
2

Ada beberapa persamaan dan perbedaan antara kelas java.lang.Exceptiondan java.lang.Error.

Kesamaan:

  • Pertama - kedua kelas meluas java.lang.Throwabledan sebagai hasilnya mewarisi banyak metode yang umum digunakan ketika berhadapan dengan kesalahan seperti: getMessage, getStackTrace, printStackTracedan sebagainya.

  • Kedua, sebagai subclass dari java.lang.Throwablekeduanya mewarisi properti berikut:

    • Throwable sendiri dan semua subkelasnya (termasuk java.lang.Error) dapat dideklarasikan dalam daftar pengecualian metode menggunakan throwskata kunci. Deklarasi semacam itu hanya diperlukan untuk java.lang.Exceptiondan subkelas, untuk java.lang.Throwable, java.lang.Errordan java.lang.RuntimeExceptiondan subkelas mereka, merupakan opsional.

    • Hanya java.lang.Throwabledan subkelas yang diizinkan untuk digunakan dalam catchklausa.

    • Hanya java.lang.Throwabledan subkelas yang dapat digunakan dengan kata kunci - throw.

Kesimpulan dari properti ini mengikuti keduanya java.lang.Errordan java.lang.Exceptiondapat dideklarasikan di header metode, bisa dalam catchklausa, dapat digunakan dengan kata kunci throw.

Perbedaan:

  • Perbedaan konseptual pertama: java.lang.Errordirancang untuk dilemparkan oleh JVM dan menunjukkan masalah serius dan dimaksudkan untuk menghentikan pelaksanaan program alih-alih tertangkap (tetapi dimungkinkan seperti halnya java.lang.Throwablepenerus 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.Exceptiondirancang 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.

  • Perbedaan kedua antara java.lang.Errordan java.lang.Exceptionyang pertama dianggap sebagai pengecualian yang tidak dicentang untuk pemeriksaan pengecualian waktu kompilasi. Karena kode hasil melempar java.lang.Erroratau subkelasnya tidak perlu menyatakan kesalahan ini di header metode. Sambil melempar java.lang.Exceptiondeklarasi yang diperlukan di header metode.

Throwable dan diagram kelas penggantinya (properti dan metode dihilangkan). masukkan deskripsi gambar di sini

Mikhailov Valentine
sumber
1

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.

Tuan Will
sumber
1

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

pengguna2485429
sumber
"Kesalahan terutama disebabkan oleh lingkungan di mana aplikasi berjalan" dan "Pengecualian terutama disebabkan oleh aplikasi itu sendiri" sempurna!
ADJ
0

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.

egaga
sumber
0

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. OutOfMemoryErrorterjadi ketika JVM kehabisan memori atau StackOverflowErrorterjadi 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: NullPointerExceptionterjadi ketika aplikasi mencoba mengakses objek nol. atau Mencoba mengakses array dengan indeks yang tidak ada atau memanggil fungsi dengan data atau parameter yang salah.

pasignature
sumber