Throwable
├── Error // 嚴重錯誤,JVM 層面,不可恢復
└── Exception // 程序可處理的異常
├── RuntimeException // 非受檢異常(Unchecked)
└── 其他 Exception // 受檢異常(Checked)
| 維度 | Checked Exception | Unchecked Exception (RuntimeException) |
|---|---|---|
| 編譯器檢查 | 強制捕獲或拋出 | 不強制 |
| 典型例子 | IOException, SQLException, ClassNotFoundException | NullPointerException, IndexOutOfBoundsException, ArithmeticException |
| 發生階段 | 編譯期可預知 | 運行期才能確定 |
| 處理策略 | try-catch 或 throws 傳遞 | 修復代碼邏輯預防 |
設計初衷:Java 強制處理 Checked 異常,旨在提高程序健壯性;RuntimeException 多為編程錯誤,應通過代碼修正避免,而非捕獲掩蓋。
OutOfMemoryError:堆內存耗盡,GC 無法回收。StackOverflowError:棧溢出,遞歸過深。NoClassDefFoundError:類加載失敗。VirtualMachineError:JVM 內部錯誤。這些錯誤表示運行環境已不可用,捕獲後也無法恢復正常業務邏輯。
try {
// 業務代碼
} catch (Error e) {
log.error("捕獲 Error", e); // 日誌記錄後怎麼辦?繼續跑?重試?都無意義
}
-XX:+HeapDumpOnOutOfMemoryError、接入 APM 監控(如 SkyWalking、Prometheus)。Web 容器(Tomcat、Jetty)、框架(Spring、Netty)會在頂層捕獲 Throwable,執行:
這屬於基礎設施代碼,業務代碼絕不應模仿。
Error 表示 JVM 不再能夠正常運行,捕獲它無法解決問題,只會掩蓋問題。正確做法是:預防發生、監控發現、容器隔離、讓進程快速失敗重啟。
業務代碼中: