異常機制提供程式錯誤處理的安全通道:發生錯誤時,方法立即終結並拋出異常物件,控制權轉移至最近的合適處理器,避免錯誤碼混雜業務邏輯,提升可讀性與健壯性。
Throwable
├── Error(系統級錯誤,應用無法處理)
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ └── ...
└── Exception(應用級異常)
├── RuntimeException(未檢查異常,編譯器不強制處理)
│ ├── NullPointerException
│ ├── ArrayIndexOutOfBoundsException
│ ├── ClassCastException
│ └── ...
└── 其他(已檢查異常,必須捕獲或聲明拋出)
├── IOException
├── SQLException
├── ClassNotFoundException
└── ...
| 類別 | 代表 | 處理義務 | 典型成因 | 處理策略 |
|---|---|---|---|---|
| Error | OOM、StackOverflow | 無需/無法處理 | JVM 內部/資源耗盡 | 記錄日誌、優雅退出 |
| RuntimeException | NPE、索引越界、類轉換 | 不強制(未檢查) | 程式邏輯錯誤 | 修正程式碼(防禦性檢查) |
| Checked Exception | IO、SQL、ClassNotFound | 必須捕獲或 throws | 外部環境不確定性 | 業務邏輯處理/向上傳遞 |
throw)try-catch → 搜尋匹配 catch 區塊(由上而下,子類優先)catch → 可選 finally → 正常繼續// 1. 聲明拋出
public void readFile(String path) throws IOException, SQLException { ... }
// 2. 主動拋出
if (obj == null) throw new IllegalArgumentException("obj cannot be null");
// 3. 捕獲多重異常(Java 7+ 多重捕獲)
try {
// 高風險操作
} catch (IOException | SQLException e) {
log.error("資源存取失敗", e);
throw new BusinessException("資料讀取異常", e); // 異常鏈
} finally {
// 清理資源(關閉串流、釋放鎖)
closeQuietly(stream);
}
// 4. try-with-resources (Java 7+ 自動關閉)
try (FileInputStream fis = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
return br.readLine();
}
Exception(Checked)或 RuntimeException(Unchecked)super(message, cause))Exception 結尾(如 InsufficientBalanceException)「捕獲並處理你知道如何處理的異常,傳遞那些你不知道如何處理的異常」
finally / try-with-resources 清理| C++ | Java | 說明 |
|---|---|---|
| logic_error | RuntimeException | 程式邏輯錯誤,可預防 |
| runtime_error | Checked Exception | 運行時環境錯誤,不可預防 |
掌握異常體系與處理藝術,是寫出專業級 Java 程式碼的關鍵分水嶺。