無論代碼多健壯,運行時異常(如 NullPointerException、ArrayIndexOutOfBoundsException)總會在最意想不到的時刻拋出。Java 5.0 之前,未捕獲異常的預設行為由 ThreadGroup.uncaughtException() 定義:僅將堆棧跟蹤輸出至 System.err,隨後終止線程。這對於需要記錄日誌、發送告警或優雅降級的生產系統顯然不足。
早期若要自定義處理邏輯,必須建立自定義 ThreadGroup 子類並覆寫 uncaughtException(Thread t, Throwable e),再將線程置於該群組中。範例展示了結合 Java Logging API 在彈出視窗顯示異常的完整實現,涉及 LoggingThreadGroup、LoggingWindowHandler、LoggingWindow 三個類,代碼冗長且耦合度高。
Tiger 引入 Thread.UncaughtExceptionHandler 接口(單一方法 uncaughtException(Thread, Throwable)),並使 ThreadGroup 實現該接口,提供兩組關鍵方法:
setUncaughtExceptionHandler() / getUncaughtExceptionHandler() —— 為單一線程及其子線程指定處理器。setDefaultUncaughtExceptionHandler() / getDefaultUncaughtExceptionHandler() —— 為所有未設置專屬處理器的線程統一行為。新寫法極為簡潔:
Thread.UncaughtExceptionHandler handler = new MyHandler();
Thread.setDefaultUncaughtExceptionHandler(handler);
// 或針對單一線程
Thread.currentThread().setUncaughtExceptionHandler(handler);
無需建立線程群組,解耦異常處理邏輯與線程組織結構,靈活性大幅提升。
同步推出的新 API 進一步強化診斷能力:
Thread.getAllStackTraces():獲取所有存活線程的堆棧快照(返回 Map<Thread, StackTraceElement[]>)。Thread.getStackTrace():獲取當前線程堆棧。Thread.getId():唯一線程標識符(long)。Thread.State 枚舉與 getState():標準化線程狀態(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED),便於監控而非同步控制。儘管舊有 ThreadGroup 方式仍相容,但新模型以更少代碼實現更強功能。建議在項目中統一採用 UncaughtExceptionHandler,集中處理日誌記錄、錯誤上報、資源清理等橫切關注點,提升系統健壯性與可維護性。