Throwable
├── Error // 系統級嚴重問題,通常不可恢復
└── Exception // 應用級問題,可處理
├── RuntimeException (Unchecked) // 邏輯錯誤,編譯器不強制處理
└── Checked Exception // 外部依賴/資源錯誤,編譯器強制處理

| 維度 | Error | Exception |
|---|---|---|
| 性質 | 系統級/資源耗盡/VM 故障 | 應用程式邏輯/外部依賴錯誤 |
| 可控性 | 全為 Unchecked(繼承 Error) | 分 Checked / Unchecked (RuntimeException) |
| 典型例子 | OutOfMemoryError、StackOverflowError、NoClassDefFoundError | IOException、SQLException、NullPointerException、IllegalArgumentException |
| 處理策略 | 系統層面監控/重啟/擴容,**代碼不應捕獲處理** | 應用層面 try-catch/throws/全局異常處理器 |
| 發生階段 | 運行時(JVM 內部) | 編譯期檢查 或 運行時拋出 |
Exception 但非 RuntimeException。throws 或 try-catch 處理。IOException、SQLException、ClassNotFoundException。RuntimeException。NullPointerException、IllegalArgumentException、IndexOutOfBoundsException、ArithmeticException。DataAccessException → Service 層轉為業務異常 → Controller 統一處理返回錯誤碼。catch (Exception e) { } 是大忌;至少記錄日誌 log.error("msg", e)。IllegalArgumentException(參數非法)、IllegalStateException(狀態非法)、UnsupportedOperationException。RuntimeException(業務邏輯錯誤)或 Exception(可恢復的受檢場景),提供錯誤碼、上下文資訊。AutoCloseable,避免 finally 繁瑣且易漏關閉。❌ 「Error 也要 catch 處理」 → 錯。OOM 時 catch 也無法恢復,應配置堆內存、排查洩漏、設置 JVM 參數
-XX:+HeapDumpOnOutOfMemoryError。❌ 「所有 Exception 都要 throws」 → 錯。RuntimeException 及其子類不應出現在 throws 子句,污染介面。
❌「用 Exception 控制流程」 → 錯。異常開銷大(填充堆疊追蹤),僅用於異常情況。