“嗨,阿米戈!
“我想告訴你一件小事,但很有趣。”
“我在聽。我喜歡小而有趣的東西。”
“嗯,你知道每個 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 對象的引用不會是多餘的。我向你保證。”
“我相信你。你從來沒有錯。”
GO TO FULL VERSION