Java異常處理模型在C++基礎上進行關鍵改進,引入try-finally、強制Throwable繼承體系、檢查型異常機制,構建更安全可靠的錯誤處理框架。
借鑒Windows SEH結構化異常處理,Java引入finally塊保證非內存資源(文件句柄、數據庫連接、Socket、鎖)必釋放:
BufferedReader rd = null;
Writer wr = null;
try {
rd = new BufferedReader(new InputStreamReader(new FileInputStream(src), encoding));
wr = new OutputStreamWriter(new FileOutputStream(dst), encoding);
// 業務邏輯
} finally {
// 任何路徑退出都會執行
if (wr != null) { wr.flush(); wr.close(); }
if (rd != null) rd.close();
}
對比C++依賴析構函數+智能指針,Java方案更直觀、不依賴GC時機。
Throwable,禁止拋出基本類型/任意對象Error(系統級不可恢復) vs Exception(應用級可恢復)RuntimeException及子類免受編譯器檢查
// 編譯錯誤:未處理受檢異常
void method() { throw new Exception("error"); }
// 正確:捕獲處理
void method() {
try { throw new Exception("error"); }
catch (Exception e) { handle(e); }
}
// 正確:聲明拋出
void method() throws Exception {
throw new Exception("error");
}
// 調用者必須處理或繼續聲明
void caller() {
try { method(); } catch (Exception e) { ... }
}
| 異常類型 | 編譯器檢查 | 典型場景 | 處理建議 |
|---|---|---|---|
| Error | 不檢查 | OOM、StackOverflow、LinkageError | 不捕獲,由JVM處理 |
| RuntimeException | 不檢查 | NPE、除零、越界、類轉換 | 預防為主,邊界捕獲 |
| 受檢異常 | 強制檢查 | IO、SQL、反射、網絡 | must catch or declare throws |
catch(Throwable)替代通配捕獲throws成類型系統一部分
// 1. try-with-resources (JDK7+)
try (Connection c = getConnection();
PreparedStatement ps = c.prepareStatement(sql)) {
return ps.executeQuery();
}
// 2. 異常鏈保留原始原因
throw new ServiceException("業務失敗", originalException);
// 3. 避免吞噬異常
catch (Exception e) {
log.error("操作失敗", e); // 記錄完整堆棧
throw new RuntimeException(e); // 或轉換拋出
}
Java異常機制通過編譯器強約束,將錯誤處理從「文檔規範」提升為「類型系統保證」,顯著降低生產環境不可預期崩潰風險。