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

Java 異常處理完整指南:五大關鍵字、最佳實踐與避坑指南

     編輯:Java 相關知識

五大關鍵字

  • try:包裹可能拋異常的代碼塊
  • catch:捕獲並處理特定異常,參數為異常類型+對象
  • finally:無論是否異常**必執行**,資源清理首選位置
  • throw:方法體內**拋出異常對象**,流程立即終止
  • throws:方法簽名聲明**可能拋出的異常類型**,傳遞給調用者

catch 多重捕獲規則

  • 順序:**從具體到通用**(子類在前,父類在後),否則編譯錯誤/永不可達
  • 匹配:異常對象類型 == catch 參數類型,或其**父類**
  • Java 7+ 支持多異常合併:catch (IOException | SQLException e)

finally 執行保證

  • return 前執行
  • 異常拋出前執行
  • 線程被 Thread.stop() 強制終止**不執行**(已棄用)
  • JVM 退出 (System.exit()) **不執行**

throws vs throw 核心差異

異常傳遞鏈路示例


void doA() throws Exception1, Exception3 {
    try {
        // 可能產生 Exception1,2,3
    } catch (Exception1 e) {
        throw e;              // 重新拋給調用者
    } catch (Exception2 e) {
        System.out.println("內部處理"); // 內部消化,不向外拋
    }
    if (a != b) throw new Exception3("自定義"); // 邏輯檢查主動拋
}
  • Exception1:捕獲後重拋 → 調用者處理
  • Exception2:內部處理完畢 → 不聲明 throws
  • Exception3:業務邏輯主動拋出 → 聲明 throws,調用者處理

檢查型異常 vs 非檢查型異常

  • 檢查型:Exception 子類(非 RuntimeException),**編譯器強制** try-catch 或 throws
  • 非檢查型:Error、RuntimeException 及子類,**編譯器不強制**,通常為編程錯誤/系統級故障

最佳實踐原則

  1. 具體捕獲:捕獲具體異常類,避免 catch (Exception e) 吞噬錯誤信息
  2. 異常鏈:重拋時保留原始堆棧:throw new BizException("業務失敗", e)
  3. 資源管理:try-with-resources (Java 7+) 自動關閉 AutoCloseable 資源
  4. 不作流控:異常用於**錯誤處理**,不用於正常業務流程控制
  5. 文檔化:Javadoc @throws 說明拋出條件
  6. 日志記錄:邊界處捕獲並記錄完整堆棧,內部層級可只拋不記

自定義異常設計


public class BizException extends RuntimeException {
    private final int code;
    public BizException(int code, String msg, Throwable cause) {
        super(msg, cause);
        this.code = code;
    }
}
  • 業務異常繼承 RuntimeException(非檢查型),減少樣板代碼
  • 攜帶錯誤碼、國際化鍵、原始原因
  • 全局異常處理器統一轉換為標準錯誤響應

總結

異常處理核心:**邊界捕獲、內部拋出、資源自動清理、錯誤碼標準化**。掌握五大關鍵字語義、catch 順序、finally 執行邊界、throws/throw 差異、檢查型與非檢查型策略,編寫健壯、可維護的 Java 代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度throwthrows
位置方法體內方法簽名
動作拋出具體異常對象聲明可能拋出的異常類型
語法throw new Exception()throws Exception1, Exception2
單獨使用否(需 try-catch 或 throws 配合)可(拋給調用者處理)
本質主動拋出動作被動聲明契約