"Hai, Amigo!

"Aku ingin memberitahumu tentang sesuatu yang kecil, tapi menarik."

"Saya mendengarkan. Saya menyukai hal-hal yang kecil dan menarik."

"Ya, Anda tahu bahwa setiap objek Thread memiliki metode run(). Dan Anda bisa menjalankannya di thread terpisah menggunakan metode start()."

"Ya, tentu saja."

"Tapi sekarang bayangkan situasi ini: Anda memulai utas untuk melakukan beberapa pekerjaan, tetapi pengecualian dilemparkan dan utas berhenti berjalan karena tidak tahu apa yang harus dilakukan. Apakah Anda tidak perlu tahu tentang kesalahan ini?"

"Saya setuju. Entah bagaimana saya harus menangkap pengecualian yang terjadi pada utas lain yang sedang berjalan. Apakah Java bahkan mendukung itu?"

"Kamu menghinaku. Tentu saja."

"Pembuat Java menemukan antarmuka khusus yang disebut UncaughtExceptionHandler. Berikut cara menangkap dan menangani pengecualian yang terjadi di utas lain, jika utas itu tidak menangkapnya:"

Contoh
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 memiliki metode setUncaughtExceptionHandler khusus . Anda harus memberikannya objek yang mengimplementasikan antarmuka Thread.UncaughtExceptionHandler . Antarmuka ini hanya memiliki satu metode: uncaughtException(Thread t, Throwable e) . Ini adalah metode yang akan dipanggil objek yang diteruskan jika pengecualian yang tidak tertangkap terjadi dalam metode jalankan."

"Dalam contoh saya di atas, saya hanya mendeklarasikan kelas dalam anonim (disorot dengan warna merah) yang mengimplementasikan antarmuka Thread.Thread.UncaughtExceptionHandler . Dan saya mengganti metode uncaughtException(Thread t, Throwable e) ."

"Seperti yang bisa Anda lihat dari daftar parameter metode, dua argumen akan diteruskan: referensi ke objek Thread tempat pengecualian terjadi, dan pengecualian itu sendiri, diteruskan sebagai Throwable e."

"Nah, mengapa saya memerlukan variabel Thread t? Bukankah kita sudah tahu di Thread mana kita meletakkan objek Thread.UncaughtExceptionHandler ?"

"Mereka melakukan ini sehingga Anda dapat menulis penangan universal untuk situasi ini. yaitu Anda dapat membuat satu objek dan meneruskannya ke lusinan utas berbeda. Kemudian metode uncaughtException( Thread t, Throwable e) selalu memberi Anda referensi ke Utas objek tempat pengecualian terjadi."

"Terlebih lagi, Anda dapat membuat lusinan utas, misalnya, dalam satu lingkaran untuk melakukan tugas tertentu. Secara umum, referensi ke objek Utas ini tidak akan berlebihan. Saya berjanji kepada Anda."

"Aku percaya padamu. Kamu tidak pernah salah."