java.lang.Throwable (實作 Serializable)
├── java.lang.Error // 嚴重錯誤,不可恢復
└── java.lang.Exception // 可預期、可處理
├── java.lang.RuntimeException // 非檢查異常
└── 其他 (IOException 等) // 檢查異常
| Error 子類 | 典型場景 | 處理策略 |
|---|---|---|
OutOfMemoryError | 堆/元空間/線程棧耗盡 | 調優 JVM 參數、排查記憶體洩漏 |
StackOverflowError | 遞歸過深、循環調用 | 改迭代、增大 -Xss |
NoClassDefFoundError | 運行時找不到類(依賴缺失/類加載器問題) | 檢查 classpath、依賴衝突 |
LinkageError | 類版本不兼容 | 統一依賴版本 |
ThreadDeath | Thread.stop() 強制終止 | 禁用 stop(),用中斷標誌 |
鐵律:Error 及其子類 絕不 應出現在 catch 塊中,讓 JVM 崩潰並生成 Dump 供事後分析。
IOException、FileNotFoundException、SQLExceptionInterruptedException(線程中斷)ClassNotFoundException(反射載入失敗)ParseException(日期/數字解析失敗)編譯器強制 try-catch 或 throws,適合「可預期、可恢復」場景。
NullPointerExceptionArrayIndexOutOfBoundsExceptionClassCastExceptionIllegalArgumentExceptionArithmeticException(除零)NumberFormatException繼承 RuntimeException,編譯器不強制處理。核心原則:預防勝於捕獲,通過防禦性編程(判空、邊界檢查、契約前置條件)消除。
catch (IOException e) 而非 catch (Exception e)throw new BizException("業務失敗", e) 保留堆疊try-with-resources 自動關閉 AutoCloseablecatch (Exception e) { log.error("", e); throw ... } 或重新拋出RuntimeException(非檢查),系統異常繼承 Exception(檢查)class Parent {
void method() throws IOException {} // 拋檢查異常
}
class Child extends Parent {
@Override
void method() throws FileNotFoundException {} // ✅ 子類異常 ⊆ 父類異常
// void method() throws Exception {} // ❌ 父類異常 ⊂ 子類異常,編譯錯誤
// void method() {} // ✅ 不拋異常也合法
}
構造器特殊:子類構造器 throws 必須 包含 父類構造器異常(因隱式 super())。
Java 異常體系設計精妙:Error 給 JVM,RuntimeException 給程式員(修 Bug),Checked Exception 給調用者(處理業務分支)。掌握分類邏輯與處理模式,是寫出健壯代碼的分水嶺。