在java多線程程序中所有線程都不允許拋出未捕獲的checked exception也就是說各個線程需要自己把自己的checked exception處理掉這一點是通過javalangRunnablerun()方法聲明(因為此方法聲明上沒有throw exception部分)進行了約束但是線程依然有可能拋出unchecked exception當此類異常跑拋出時線程就會終結而對於主線程和其他線程完全不受影響且完全感知不到某個線程拋出的異常(也是說完全無法catch到這個異常)JVM的這種設計源自於這樣一種理念線程是獨立執行的代碼片斷線程的問題應該由線程自己來解決而不要委托到外部基於這樣的設計理念在Java中線程方法的異常(無論是checked還是unchecked exception)都應該在線程代碼邊界之內(run方法內)進行try catch並處理掉
但如果線程確實沒有自己try catch某個unchecked exception而我們又想在線程代碼邊界之外(run方法之外)來捕獲和處理這個異常的話java為我們提供了一種線程內發生異常時能夠在線程代碼邊界之外處理異常的回調機制即Thread對象提供的setUncaughtExceptionHandler(ThreadUncaughtExceptionHandler eh)方法
通過該方法給某個thread設置一個UncaughtExceptionHandler可以確保在該線程出現異常時能通過回調UncaughtExceptionHandler接口的public void uncaughtException(Thread t Throwable e) 方法來處理異常這樣的好處或者說目的是可以在線程代碼邊界之外(Thread的run()方法之外)有一個地方能處理未捕獲異常但是要特別明確的是雖然是在回調方法中處理異常但這個回調方法在執行時依然還在拋出異常的這個線程中!
比之上述方法還有一種編程上的處理方式可以借鑒即有時候主線程的調用方可能只是想知道子線程執行過程中發生過哪些異常而不一定會處理或是立即處理那麼發起子線程的方法可以把子線程拋出的異常實例收集起來作為一個Exception的List返回給調用方由調用方來根據異常情況決定如何應對不過要特別注意的是此時子線程早以終結
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27290.html