首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 異常處理機制全解析:體系結構、最佳實踐與常見陷阱

     編輯:Java 相關知識

前言

異常處理是 Java 健壯性的基石。本文系統梳理異常體系、處理流程、自定義異常、try-with-resources 等核心機制,並總結生產環境常見錯誤模式。

異常體系繼承圖

java.lang.Throwable
├── Error                  // 嚴重錯誤,不可恢復(OOM, StackOverflow)
└── Exception              // 可處理的異常
    ├── RuntimeException   // 非檢查異常(空指針、越界、類轉換)
    └── 其他               // 檢查異常(IO、SQL、ClassNotFound)

核心處理機制

1. 拋捕模型

  • throw:顯式拋出異常對象
  • throws:方法簽名聲明拋出檢查異常
  • try-catch-finally:捕獲並處理,finally 保證資源釋放

2. 多重 catch 與異常鏈

try {
    // 高風險代碼
} catch (SQLException | IOException e) { // Java 7+ 多重捕獲
    log.error("資源訪問失敗", e);
    throw new BusinessException("數據層異常", e); // 保留原始堆棧
} finally {
    closeResources(); // 必執行清理
}

3. try-with-resources (Java 7+)

// 自動關閉實現 AutoCloseable 的資源
try (Connection conn = dataSource.getConnection();
     PreparedStatement ps = conn.prepareStatement(sql)) {
    return ps.executeQuery();
} // 編譯器自動生成 finally 關閉邏輯

檢查異常 vs 非檢查異常:如何選擇

維度檢查異常非檢查異常
編譯器強制是(必須 catch 或 throws)否
典型場景外部依賴失敗(IO、網絡、數據庫)編程錯誤(參數非法、邏輯缺陷)
恢復可能性高(可重試、降級、轉碼)低(通常需修復代碼)
API 設計建議調用方必須感知並處理的情況調用方無法合理處理的情況

自定義異常最佳實踐

// 業務異常基類:非檢查,攜帶錯誤碼
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; }
}

// 使用示例
if (user == null) throw new BizException(4001, "用戶不存在");
if (balance < amount) throw new BizException(4002, "餘額不足");

七大反模式與修正

  1. 吞沒異常:catch (Exception e) {} → 至少記錄日誌或重拋
  2. 過度捕獲:catch (Exception e) 捕獲過廣 → 精確捕獲具體異常
  3. 異常控制流:用異常替代條件判斷 → 性能差、可讀性低
  4. 丟失堆棧:throw new MyException() 未帶 cause → 永遠保留鏈路
  5. finally 中拋異常:掩蓋原始異常 → try-with-resources 避免
  6. 日誌重複:多層 catch 重複記錄 → 統一在邊界層記錄
  7. 忽略 InterruptedException:清空中斷狀態 → 重新設置 Thread.currentThread().interrupt()

異常處理原則總結

  • 早拋早捕:在邊界層(Controller、Gateway)統一轉換為統一響應格式
  • 異常即文檔:方法簽名的 throws 傳遞契約信息
  • 失敗快速:參數校驗前置,非法狀態立即拋出
  • 資源安全:AutoCloseable + try-with-resources 成標配
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved