1. 程式人生 > 其它 >java的異常丟擲機制

java的異常丟擲機制

技術標籤: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的原始碼還是很好理清楚邏輯的。