"Hai, Amigo!
"Saya ingin memberitahu anda tentang sesuatu yang kecil, tetapi menarik."
"Saya sedang mendengar. Saya suka perkara yang kecil dan menarik."
"Nah, anda tahu bahawa setiap objek Thread mempunyai kaedah run(). Dan anda boleh melaksanakannya pada thread berasingan menggunakan kaedah start()."
"Ya sudah tentu."
"Tetapi sekarang bayangkan situasi ini: anda memulakan benang untuk melaksanakan beberapa kerja, tetapi pengecualian dilemparkan dan benang berhenti berjalan kerana ia tidak tahu apa yang perlu dilakukan. Bukankah anda perlu tahu tentang ralat ini entah bagaimana?"
"Saya setuju. Entah bagaimana saya perlu menangkap pengecualian yang berlaku pada utas lain yang sedang berjalan. Adakah Java juga menyokongnya?"
"Awak menghina saya. Sudah tentu."
"Pencipta Java mencipta antara muka khas yang dipanggil UncaughtExceptionHandler. Berikut ialah cara untuk menangkap dan mengendalikan pengecualian yang berlaku pada urutan lain, jika utas itu tidak menangkapnya:"
public class DownloadManager
{
public static void main(String[] args)
{
Thread thread = new DownloadThread();
thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
}
});
thread.start();
}
"Objek Thread mempunyai kaedah setUncaughtExceptionHandler khas . Anda perlu memberikannya objek yang melaksanakan antara muka Thread.UncaughtExceptionHandler . Antara muka ini hanya mempunyai satu kaedah: uncaughtException(Thread t, Throwable e) . Ini ialah kaedah yang akan dipanggil objek yang diluluskan jika pengecualian yang tidak ditangkap berlaku dalam kaedah larian."
"Dalam contoh saya di atas, saya hanya mengisytiharkan kelas dalaman tanpa nama (diserlahkan dalam warna merah) yang melaksanakan Thread. Antara muka Thread.UncaughtExceptionHandler . Dan saya mengatasi kaedah uncaughtException(Thread t, Throwable e) ."
"Seperti yang anda boleh lihat daripada senarai parameter kaedah, dua argumen akan diluluskan: rujukan kepada objek Thread di mana pengecualian berlaku, dan pengecualian itu sendiri, diluluskan sebagai Throwable e."
"Nah, kenapa saya perlukan pembolehubah Thread t? Bukankah kita sudah tahu Thread mana yang kita letak objek Thread.UncaughtExceptionHandler ?"
"Mereka melakukan ini supaya anda boleh menulis pengendali sejagat untuk situasi ini. iaitu anda boleh mencipta satu objek dan menghantarnya kepada berdozen benang yang berbeza. Kemudian kaedah uncaughtException( Thread t, Throwable e) sentiasa memberi anda rujukan kepada Objek benang di mana pengecualian berlaku."
"Apatah lagi, anda boleh mencipta berpuluh-puluh utas, contohnya, dalam satu gelung untuk melaksanakan tugas tertentu. Secara umum, rujukan kepada objek Thread ini tidak akan berlebihan. Saya berjanji itu kepada anda."
"Saya percaya awak. Awak tak pernah salah."
GO TO FULL VERSION