程序運行期間出現的違背預期事件,導致正常流程中斷。來源包括:用戶輸入無效、資源缺失(文件/網絡)、資源耗盡(OOM)、空指針解引用等。
| 類別 | 代表 | 特點 | 處理策略 |
|---|---|---|---|
| 檢查異常 (Checked Exception) | IOException, SQLException | 編譯期強制捕獲/拋出,外部環境導致,可預期可恢復 | try-catch 處理或 throws 向上拋,調用者必須處理 |
| 運行時異常 (Runtime Exception) | NullPointerException, IndexOutOfBoundsException, IllegalArgumentException | 編譯期不檢查,邏輯錯誤導致,本可避免 | 修正代碼邏輯(非空判斷、邊界檢查),一般不捕獲 |
| 錯誤 (Error) | OutOfMemoryError, StackOverflowError | JVM 層面嚴重問題,應用無法恢復 | 不捕獲,記錄日誌後讓程序崩潰,排查根因 |
Throwable
├── Error // 嚴重錯誤
└── Exception // 異常
├── RuntimeException // 非檢查異常
│ ├── NullPointerException
│ ├── IllegalArgumentException
│ └── ...
└── IOException // 檢查異常
├── FileNotFoundException
└── ...
└── SQLException // 檢查異常
| 方法 | 說明 |
|---|---|
getMessage() | 返回構造器傳入的詳細信息 |
getCause() | 返回導致此異常的根因(鏈式異常) |
toString() | 類名 + ": " + getMessage() |
printStackTrace() | 輸出堆棧軌跡至 System.err(含原因鏈) |
getStackTrace() | 返回 StackTraceElement[],可程序化分析 |
catch (Exception e) 吞噬異常。throw new BizException("msg", cause),保留根因堆棧。try-with-resources 自動關閉 AutoCloseable。log.error("msg", e) 而非 e.printStackTrace()。public class BizException extends RuntimeException {
private final int code;
public BizException(int code, String msg) { super(msg); this.code = code; }
public BizException(int code, String msg, Throwable cause) { super(msg, cause); this.code = code; }
public int getCode() { return code; }
}