“嗨,阿米戈!

“我想告訴你一件小事,但很有趣。”

“我在聽。我喜歡小而有趣的東西。”

“嗯,你知道每個 Thread 對像都有一個 run() 方法。你可以使用 start() 方法在單獨的線程上執行它。”

“是的當然。”

“但是現在想像一下這種情況:你啟動一個線程來執行一些工作,但是拋出異常並且線程停止運行,因為它不知道該怎麼做。你不需要以某種方式知道這個錯誤嗎?”

“我同意。我需要以某種方式捕獲發生在另一個正在運行的線程上的異常。Java 支持嗎?”

“你侮辱我,當然是。”

“Java 的創建者發明了一個名為 UncaughtExceptionHandler 的特殊接口。下面是如何捕獲和處理另一個線程上發生的異常,如果該線程沒有捕獲它的話:”

例子
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();
}

“Thread 對像有一個特殊的setUncaughtExceptionHandler方法。您需要向它傳遞一個實現Thread.UncaughtExceptionHandler接口的對象。該接口只有一個方法:uncaughtException(Thread t, Throwable e)。這是將在如果在 run 方法中發生未捕獲的異常,則傳遞的對象。”

“在我上面的示例中,我只是聲明了一個匿名內部類(以紅色突出顯示),它實現了 Thread.Thread.UncaughtExceptionHandler接口。我重寫了它的uncaughtException(Thread t, Throwable e)方法。”

“從方法的參數列表中可以看出,將傳遞兩個參數:對發生異常的 Thread 對象的引用,以及異常本身,作為 Throwable e 傳遞。”

“嗯,為什麼我需要 Thread 變量 t?難道我們不知道我們要將Thread.UncaughtExceptionHandler對象放入哪個線程嗎?”

“他們這樣做是為了讓你可以為這些情況編寫一個通用處理程序。即你可以創建一個對象並將它傳遞給幾十個不同的線程。然後 uncaughtException( Thread t, Throwable e)方法總是給你一個引用發生異常的線程對象。”

“更重要的是,你可以創建幾十個線程,例如,在一個循環中執行特定任務。一般來說,這個對 Thread 對象的引用不會是多餘的。我向你保證。”

“我相信你。你從來沒有錯。”