java的異常丟擲機制
阿新 • • 發佈:2020-12-23
技術標籤:JavaSe基礎知識
/**
* 在Thread類中定義了針對未被捕捉的異常的處理方式,其由JVM呼叫
* Dispatch an uncaught exception to the handler. This method is
* intended to be called only by the JVM.
*/
private void dispatchUncaughtException(Throwable e) {
getUncaughtExceptionHandler().uncaughtException (this, e);
}
/**
* 獲取對應的異常處理器,如果有手動設定指定,則獲取對應的,否則獲取該執行緒對應的執行緒組物件
*/
public UncaughtExceptionHandler getUncaughtExceptionHandler() {
return uncaughtExceptionHandler != null ?
uncaughtExceptionHandler : group;
}
/* The group of this thread */
private ThreadGroup group;
// null unless explicitly set Thread中定義了未捕捉異常處理器,預設為null,除非通過setUncaughtExceptionHandler方法賦值
private volatile UncaughtExceptionHandler uncaughtExceptionHandler;
// null unless explicitly set 預設的異常處理器,也需要手動進行賦值
private static volatile UncaughtExceptionHandler defaultUncaughtExceptionHandler;
/** ThreadGroup 實現了UncaughtExceptionHandler介面 */
public class ThreadGroup implements Thread.UncaughtExceptionHandler {...}
/** ThreadGroup 提供了預設實現 */
public void uncaughtException(Thread t, Throwable e) {
/*
* 先判斷父執行緒組是否為null,不為null則呼叫父執行緒組的uncaughtException方法,
* 而父執行緒組如果都不重寫該方法的話,最終會追溯到system執行緒組,它沒有父執行緒組
*/
if (parent != null) {
parent.uncaughtException(t, e);
} else {
Thread.UncaughtExceptionHandler ueh =
Thread.getDefaultUncaughtExceptionHandler();
// 嘗試獲取預設的異常處理器進行異常處理
if (ueh != null) {
ueh.uncaughtException(t, e);
// 這裡就是預設操作了,列印異常堆疊資訊到控制檯上
} else if (!(e instanceof ThreadDeath)) {
System.err.print("Exception in thread \""
+ t.getName() + "\" ");
e.printStackTrace(System.err);
}
}
}
其實看ThreadGroup以及Thread的原始碼還是很好理清楚邏輯的。