Dalam bahasa Java, pengecualian dibagi menjadi dua kategori:
Pengecualian yang diperiksa: Jenis pengecualian ini harus secara eksplisit dimasukkan ke dalam klausa throws atau dimasukkan ke dalam metode. Misalnya, IOException atau ClassNotFoundException.
Pengecualian yang tidak dicentang: Jenis pengecualian ini tidak perlu dilempar atau ditangkap secara eksplisit. Misalnya, NumberFormatException.
Ketika pengecualian yang dicentang dilemparkan ke dalam metode run() pada objek Thread, kita harus menangkap dan menanganinya karena metode run() tidak dapat memunculkan pengecualian. Ketika pengecualian yang tidak dicentang dilemparkan ke dalam metode run() objek Thread, perilaku defaultnya adalah mencetak informasi pelacakan tumpukan di konsol dan kemudian keluar dari program.
Untungnya, Java memberi kita mekanisme yang dirancang khusus untuk menangani pengecualian yang tidak dicentang yang dilemparkan oleh objek Thread untuk menghindari keluarnya program.
Pada bagian ini, kami menggunakan contoh untuk mendemonstrasikan mekanisme ini.
mengetahuinya
Ikuti langkah-langkah yang ditunjukkan di bawah ini untuk menerapkan contoh kita.
1. Pertama, kita perlu mengimplementasikan kelas untuk menangani pengecualian yang tidak dicentang. Kelas ini harus mengimplementasikan kelas UncaughtExceptionHandler dan mengimplementasikan metode uncaughtException() yang dideklarasikan di antarmuka ini. Dalam contoh ini, nama kelasnya adalah ExceptionHandler, dan metode uncaughtException() mencetak pengecualian dan informasi thread yang memunculkan pengecualian tersebut. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
kelas publik ExceptionHandler mengimplementasikan Thread.UncaughtExceptionHandler {
@Mengesampingkan
public void uncaughtException(Utas t, Dapat Dilempar e) {
System.out.printf("Pengecualian telah ditangkap//n");
System.out.printf("Utas: %s/n", t.getId());
System.out.printf("Pengecualian: %s: %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("Pelacakan Tumpukan: /n");
e.printStackTrace(Sistem.keluar);
System.out.printf("Status thread: %s/n", t.getState());
}
}
2. Mengimplementasikan kelas yang dapat memunculkan pengecualian yang tidak dicentang, yang disebut Tugas, mengimplementasikan antarmuka Runnable, mengimplementasikan metode run(), dan secara khusus mengkodekan sepotong kode yang dapat menghasilkan pengecualian yang tidak dicentang, misalnya, mengubah string menjadi angka. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
tugas kelas publik mengimplementasikan Runnable {
@Mengesampingkan
menjalankan kekosongan publik() {
int angka = Integer.parseInt("diguage.com");
}
}
3. Buat kelas utama program, kelas Utama, lalu implementasikan metode main(). Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
kelas publik Utama {
public static void main(String[] args) {
4. Buat objek Task dan buat objek Thread untuk menjalankannya. Gunakan metode setUncaughtExceptionHandler() untuk menyetel kelas penanganan untuk pengecualian yang tidak dicentang. Kemudian, mulai threadnya. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
Tugas tugas = Tugas baru();
Utas utas = Utas baru (tugas);
thread.setUncaughtExceptionHandler(new ExceptionHandler());
thread.mulai();
5. Jalankan contoh dan lihat hasilnya.
tahu kenapa
Hasil eksekusi yang tidak normal dapat dilihat dari cuplikan keluaran di bawah ini. Pengecualian dilempar, kemudian ditangkap oleh kelas handler dan informasi pengecualian dicetak ke konsol.
Copy kode kodenya sebagai berikut:
Pengecualian telah ditangkap
Topik: 9
Pengecualian: java.lang.NumberFormatException: Untuk string masukan: "diguage.com"
Pelacakan Tumpukan:
java.lang.NumberFormatException: Untuk string masukan: "diguage.com"
di java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
di java.lang.Integer.parseInt(Integer.java:492)
di java.lang.Integer.parseInt(Integer.java:527)
di com.diguage.books.concurrencycookbook.chapter1.recipe8.Task.run(Task.java:13)
di java.lang.Thread.run(Thread.java:722)
Status thread: DAPAT DIJALANKAN
Proses selesai dengan kode keluar 0
Ketika sebuah thread memunculkan pengecualian dan pengecualian (di sini secara khusus mengacu pada pengecualian yang tidak dicentang) tidak tertangkap, mesin virtual Java memeriksa apakah kelas penanganan pengecualian yang tidak dicentang disetel melalui metode yang sesuai dan meneruskan utas dan pengecualian sebagai parameter ke metode tersebut.
Jika tidak ada kelas pemrosesan yang diatur, mesin virtual Java akan mencetak informasi pelacakan tumpukan di konsol dan kemudian keluar dari program.
tidak pernah berakhir
Kelas Thread juga memiliki metode yang terkait dengan penanganan pengecualian yang tidak dicentang. Ini adalah metode statis setDefaultUncaughtExceptionHandler(), yang dapat menyetel kelas penanganan pengecualian yang tidak dicentang untuk semua thread dalam program.
Ketika pengecualian yang tidak tertangkap dilemparkan ke dalam thread, mesin virtual Java mencari kelas penanganan pengecualian dari tiga tempat:
Pertama, cari kelas penanganan pengecualian dari objek thread, dan itulah yang kita pelajari di bagian ini. Jika tidak ada, kelas penanganan pengecualian dicari dari grup thread (ThreadGroup) tempat thread berada. Bagian ini akan dijelaskan secara spesifik nanti. Jika masih belum ada, cari kelas penanganan pengecualian default program yang disebutkan di atas.
Jika tidak ada penangan pengecualian yang disebutkan di atas, mesin virtual Java akan mencetak informasi pelacakan tumpukan pengecualian ke konsol dan kemudian keluar dari program.
Gunakan doktrin
Artikel ini diterjemahkan dari "Buku Masak Konkurensi Java 7" (D Gua Ge mencurinya sebagai "Koleksi Contoh Konkurensi Java7") dan hanya digunakan sebagai bahan pembelajaran. Ini tidak boleh digunakan untuk tujuan komersial apa pun tanpa izin.
Keberhasilan kecil
Kode lengkap kelas ExceptionHandler adalah sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Kelas penanganan pengecualian tidak dicentang
* Tanggal: 22-09-2013
* Waktu: 23:11
*/
kelas publik ExceptionHandler mengimplementasikan Thread.UncaughtExceptionHandler {
@Mengesampingkan
public void uncaughtException(Utas t, Dapat Dilempar e) {
System.out.printf("Pengecualian telah ditangkap/n");
System.out.printf("Utas: %s/n", t.getId());
System.out.printf("Pengecualian: %s: %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("Pelacakan Tumpukan: /n");
e.printStackTrace(Sistem.keluar);
System.out.printf("Status thread: %s/n", t.getState());
}
}
Kode lengkap kelas Tugas
Copy kode kodenya sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Kelas generasi pengecualian
* Tanggal: 22-09-2013
* Waktu: 23:18
*/
tugas kelas publik mengimplementasikan Runnable {
@Mengesampingkan
menjalankan kekosongan publik() {
int angka = Integer.parseInt("diguage.com");
}
}
Kode lengkap kelas Utama
Copy kode kodenya sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Contoh kelas utama
* Tanggal: 22-09-2013
* Waktu: 23:20
*/
kelas publik Utama {
public static void main(String[] args) {
Tugas tugas = Tugas baru();
Utas utas = Utas baru (tugas);
thread.setUncaughtExceptionHandler(pengecualian baru());
thread.mulai();
}
}