Dalam bahasa Java, kelas dasar dari kelas kesalahan adalah java.lang.error, dan kelas dasar dari kelas pengecualian adalah java.lang.exception.
1) Kesamaan: java.lang.Error dan java.lang.Exception keduanya adalah subkelas dari java.lang. dan melempar myException baru (); Di mana, kelas MyError adalah subclass dari java.lang.error, dan kelas MyException adalah subclass dari java.lang.exception.
2) Perbedaan: Java.lang.Error itu sendiri dan subclassnya tidak memerlukan dukungan dari pernyataan TRY-Catch. Metode ini dapat dikembalikan kapan saja, sebagaimana didefinisikan oleh metode berikut:
string publik mymethod () {lempar myeRror baru (); } Di mana kelas MyError adalah subclass dari Java.lang.Error Class.
java.lang.Exception sendiri dan subkelasnya membutuhkan dukungan dari pernyataan mencoba-tangkapan, dan definisi metode berikut ini salah:
string publik mymethod () {lempar myException baru (); }Metode yang benar didefinisikan sebagai berikut:
string publik mymethod () melempar myException {lempar myException baru (); }Di mana kelas MyException adalah subclass dari java.lang.exception.
Pengecualian Java adalah objek yang dibuat ketika situasi abnormal ditemui ketika program Java sedang berjalan. Ini merangkum informasi pengecualian. Kelas root dari pengecualian Java adalah java.lang. Dicrowable. Seluruh kelas memiliki dua subclass langsung java.lang.Error dan java.lang.exception.Error adalah kesalahan serius yang tidak dapat dipulihkan oleh program itu sendiri. Pengecualian menunjukkan kesalahan pengecualian yang dapat ditangkap dan diproses oleh program. JVM menggunakan stack panggilan metode untuk melacak serangkaian proses panggilan metode di setiap utas, yang menyimpan informasi lokal dari setiap metode panggilan. Untuk program Java independen, itu bisa saja ke metode utama program. Ketika metode baru dipanggil, JVM menempatkan struktur tumpukan yang menggambarkan metode di bagian atas tumpukan, dan metode di bagian atas tumpukan adalah metode eksekusi yang benar. Ketika A J setelah metode AVA dieksekusi secara normal, JVM kembali ke struktur tumpukan metode dari tumpukan panggilan, dan kemudian terus memproses metode sebelumnya. Jika metode Java melempar pengecualian selama pelaksanaan kode, JVM harus menemukan kode blok tangkapan yang dapat menangkap pengecualian. Pertama -tama memeriksa apakah metode saat ini memiliki blok kode tangkapan seperti itu, dan jika ada, jalankan blok kode tangkapan. Jika tidak, JVM kembali ke struktur tumpukan metode di tumpukan panggilan, dan terus menemukan blok kode tangkapan yang sesuai dalam metode sebelumnya. Akhirnya, jika JVM mengejar metode utama (), yaitu, ia terus melempar pengecualian ke metode utama (), dan masih belum menemukan blok kode untuk penangan pengecualian, utas akan berakhir secara tidak normal. Jika utas adalah utas utama, aplikasi juga akan berakhir sesuai. Pada saat ini, JVM akan melempar pengecualian langsung ke pengguna, dan informasi pengecualian asli akan terlihat di terminal pengguna.
Java.lang. Analisis kode sumber yang dapat dicoret
paket java.lang; impor java.io.*; /** * * Throwable is the parent class of all Error and Exceptiong* Note that it has four constructors: * Throwable() * Throwable(String message) * Throwable(Throwable cause) * Throwable(String message, Throwable cause) * */ public class Throwable implements Serializable { private static final long serialVersionUID = -3042686055658047285L; /*** Kode asli menyimpan beberapa indikasi tumpukan backtrace di slot ini. */ Backtrace objek transien pribadi; / *** Informasi yang menjelaskan pengecualian ini*/ private string detailMessage; / *** menunjukkan bahwa pengecualian saat ini disebabkan oleh yang dapat dilempar* jika null berarti bahwa pengecualian tidak disebabkan oleh lainnya yang dapat dilempar* jika objek ini sama dengan dirinya sendiri, itu menunjukkan bahwa objek yang menyebabkan pengecualian belum diinisialisasi*/ Penyebab yang dapat dilempar pribadi = ini; / *** array yang menggambarkan trek pengecualian*/ stacktraceElement private [] Stacktrace; / *** Konstruktor, Objek Penyebab tidak diinisialisasi dapat diinisialisasi di masa depan menggunakan initcause* FillinStackTrace dapat digunakan untuk menginisialisasi array trek pengecualian*/ public lempar () {fillinstacktrace (); } /*** konstruktor* /public lempar (pesan string) {// Isi array trek pengecualian fillinstackTrace (); // Inisialisasi Deskripsi Pengecualian Informasi DetailSMessage = pesan; } / *** Konstruktor, Penyebab mewakili objek penyebab* / lemparan publik (pesan string, penyebab yang dapat dilempar) {fillinstacktrace (); DetailMessage = pesan; this.Cause = penyebab; } / *** konstruktor* / lemparan publik (penyebab lempar) {fillinstacktrace (); detailMessage = (penyebab == null? null: cause.toString ()); this.Cause = penyebab; } / *** Dapatkan informasi terperinci* / string publik getMessage () {return detailMessage; } / *** Dapatkan informasi terperinci* / string publik getLocalizedMessage () {return getMessage (); } / *** Dapatkan objek Penyebab* / getCause yang dapat dilemparkan publik () {return (penyebab == ini? NULL: Penyebab); } /*** Inisialisasi objek Penyebab. Metode ini hanya dapat dipanggil sekali tanpa inisialisasi*/ init yang dapat dilempar publik yang disinkronkan (penyebab yang dapat dilempar) {// Jika itu bukan keadaan yang tidak diwariskan, lempar pengecualian jika (this.Cause! = Ini) melempar IllegalStateException baru ("tidak dapat menimpa penyebab"); // Objek penyebab yang akan ditetapkan sama dengan dirinya sendiri dan melemparkan pengecualian jika (penyebab == ini) melempar IllegalArgumentException baru ("Wausus diri tidak diperbolehkan"); // atur objek penyebab this.Cause = penyebab; // kembalikan Objek Penyebab Set Kembalikan ini; } / *** Representasi string* / public String toString () {string s = getClass (). GetName (); String message = getLocalizedMessage (); return (pesan! = null)? (s + ":" + pesan): s; } / *** Cetak trek kesalahan* / public void printStackTrace () {printStackTrace (System.err); } /*** Cetak trek kesalahan* /public void printStackTrace (printStream s) {disinkronkan (s) {// memanggil metode toString dari objek saat ini s.println (this); // Dapatkan StackTraceElement Array Track Exception [] Trace = getourstacktrace (); // Cetak representasi string dari setiap elemen untuk (int i = 0; i <trace.length; i ++) s.println ("/tat"+trace [i]); // Dapatkan objek penyebab yang dapat dilemparkan OurCause = getCause (); // Cetak secara rekursif informasi dari objek Penyebab jika (OurCause! = Null) OurcaCause.PrintStackTraceAscause (S, Trace); }} /*** Cetak Informasi Objek Penyebab* @param s Cetak Stream* @param Cuscedtrace Exception Track Dengan pengecualian yang disebabkan oleh objek ini* /private void printStackTraceAsause (printStream S, stacktraceElement [] getourstack) {// dapatkan stackeLement trek pengecualian saat ini [] trace = getourstack) {// Get the Exception Track StackElement [] Track = getourstack) () () () saat ini StackElement Track Stacktrace [] trace = getourstack) {// Getoursk () () () () Track (] trace = getourstack (// Get the Exception Track StackRaceElement [] trace = getourstack) () (); // m adalah elemen terakhir dari array trek pengecualian saat ini, // n adalah elemen terakhir dari array trek pengecualian dari pengecualian yang disebabkan oleh objek saat ini int m = trace.length-1, n = causeTtrace.length-1; // Loop dari belakang dua array masing -masing. Jika sama, loop sampai ketidaksetaraan atau array mencapai awal sementara (m> = 0 && n> = 0 && jejak [m] .Equals (penyebabTtrace [n])) {m--; N--; } // angka yang sama int framesincommon = trace.length - 1 - m; // Cetak jejak kesalahan yang berbeda S.println ("disebabkan oleh:" + ini); untuk (int i = 0; i <= m; i ++) s.println ("/tat"+trace [i]); // Jika ada nomor yang sama, cetak nomor yang sama jika (framesincommon! = 0) s.println ("/t ..." + framesincommon + "more"); // Dapatkan penyebab objek ini dan cetak informasi yang dapat dibuang secara rekursif OurCause = getCause (); if (OurCause! = null) OurcaCause.PrintStackTraceAseAse (S, Trace); } / *** Cetak trek kesalahan* / public void printStackTrace (printwriter s) {disinkronkan (s) {s.println (this); StacktraceElement [] trace = getourstacktrace (); untuk (int i = 0; i <trace.length; i ++) s.println ("/tat"+trace [i]); Throwable OurCause = getCause (); if (OurCause! = null) OurcaCause.PrintStackTraceAseAse (S, Trace); }} / *** Cetak informasi tentang objek Penyebab* / private void printStackTraceAseause (printwriter S, stacktraceElement [] penyebabTrace) {// assert thread.holdslock (s); // Hitung jumlah frame yang sama antara ini dan disebabkan StacktraceElement [] trace = getourstacktrace (); int m = trace.length-1, n = CauseTtrace.length-1; while (m> = 0 && n> = 0 && trace [m] .equals (penyebabtrace [n])) {m--; N--; } int framesincommon = trace.length - 1 - m; s.println ("disebabkan oleh:" + ini); untuk (int i = 0; i <= m; i ++) s.println ("/tat"+trace [i]); if (framesincommon! = 0) s.println ("/t ..." + framesincommon + "more"); // Berkaca jika kita memiliki penyebab yang dapat dilempar ourcauses = getCause (); if (OurCause! = null) OurcaCause.PrintStackTraceAseAse (S, Trace); } / *** Isi trek pengecualian* / public native lempar yang dapat dilewati FillinStackTrace (); / *** Mengembalikan salinan trek pengecualian saat ini*/ public stacktraceElement [] getStackTrace () {return (stacktraceElement []) getourstacktrace (). Clone (); } /** * Dapatkan trek pengecualian saat ini * /private Sinkronisasi stacktraceElement [] getourstackTrace () {// Jika metode ini dipanggil untuk pertama kalinya, array trek pengecualian diinisialisasi if (stacktrace == null) {// Dapatkan kedalaman track intux intercth = getstacktrace (); // Buat array baru trek pengecualian dan isi stacktrace = stacktraceElement baru [kedalaman]; untuk (int i = 0; i <kedalaman; i ++) Stacktrace [i] = getStackTraceElement (i); // Dapatkan trek pengecualian dari titik bit yang ditentukan} return stacktrace; } /*** Setel trek pengecualian* /public void setStackTrace (stacktraceElement [] stacktrace) {// Salin parameter pengaturan stacktraceElement [] DEFEDENCIVECOPY = (stacktraceElement []) stacktrace.clone (); // Jika parameter pengaturan memiliki elemen kosong, pengecualian akan dilemparkan untuk (int i = 0; i <defensiveCopy.length; i ++) if (defensiveCopy [i] == null) melempar nullPointerException baru ("Stacktrace [" + i + "]"); // Atur trek pengecualian dari objek saat ini this.stacktrace = defensiveCopy; } / ** * Kedalaman trek pengecualian, 0 berarti tidak mungkin untuk mendapatkan * / private int int getStackTredEpth (); / *** Dapatkan trek pengecualian dari bit point yang ditentukan*/ private NIVEL STACKTRACEElement GetStackTraceElement (INT INDEX); private disinkronkan void writeObject (java.io.objectOutputStream s) melempar ioException {getourstacktrace (); S.DefaultWriteObject (); }}