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

Java 異常處理體系精講:Error、Exception、RuntimeException 三層結構與捕獲策略

     編輯:Java 綜合教學

Java 異常架構全景圖:從 Throwable 根節點到捕獲最佳實踐

異常處理是 Java 程序健壯性的基石。理解 `Throwable` 繼承體系、`Error` vs `Exception`、`Checked` vs `Unchecked` (RuntimeException) 的區別,是編寫正確 `try-catch-finally` / `throws` 代碼的前提。

一、 繼承體系總覽

java.lang.Throwable
├── java.lang.Error           // 嚴重錯誤:JVM 級、系統級,不可恢復,代碼無需捕獲
│   ├── OutOfMemoryError
│   ├── StackOverflowError
│   └── NoClassDefFoundError
└── java.lang.Exception       // 程序可處理的異常
    ├── java.lang.RuntimeException  // 運行時異常 (Unchecked):編譯器不強制捕獲
    │   ├── NullPointerException
    │   ├── IndexOutOfBoundsException
    │   ├── IllegalArgumentException
    │   └── ClassCastException
    └── 其他 Exception (Checked Exception)  // 編譯器強制捕獲或拋出
        ├── IOException
        ├── SQLException
        ├── ClassNotFoundException
        └── 自定義業務異常

異常體系圖

二、 三大核心分類詳解

類別代表成因處理策略
ErrorOOM, StackOverflowJVM/硬件故障、類加載失敗不捕獲,讓程序崩潰,通過監控告警、堆轉儲分析根因,優化代碼/調優 JVM 參數解決。
Checked Exception
(受檢異常)
IOException, SQLException外部資源不可控 (網絡、磁盤、DB)必須捕獲或聲明 throws。調用者感知風險,決定重試、降級、轉碼拋出。
RuntimeException
(非受檢/運行時異常)
NPE, IndexOOB, IllegalArg編程邏輯錯誤 (空指針、越界、參數非法)不強制捕獲。核心原則:預防勝於捕獲。代碼中加防御性判空、邊界檢查,讓 Bug 在測試階段暴露。

三、 RuntimeException 特殊機制

  • 繼承自 `RuntimeException` 的異常,編譯器不檢查是否 `try-catch` 或 `throws`。
  • 若不捕獲,會沿調用棧向上拋出,最終到達 `main()` 線程終止,JVM 打印堆棧信息 (`printStackTrace()`) 退出。
  • 典型場景:`if (obj == null) throw new NullPointerException();` → 直接寫 `obj.method()` 觸發 NPE 即可,JVM 自動拋出,堆棧信息更準確 (指向調用行)。

四、 捕獲與拋出決策流程圖

  1. 能否在當前方法有意義地處理? (如重試、降級、記錄日志、轉換為業務異常) → 捕獲 (try-catch)。
  2. 無法處理 / 需調用者決策? → 聲明拋出 (throws)。
    • Checked Exception:必須 在方法簽名 `throws`。
    • RuntimeException:可選 寫 `@throws` 文檔,不寫 `throws` 子句也合法。
  3. 不可恢復的嚴重錯誤? (如配置文件缺失導致系統無法啟動) → 捕獲後記錄錯誤日志,拋出 RuntimeException (或 `Error`) 讓程序快速失敗。

五、 代碼最佳實踐

// 1. 捕獲具體異常,避免 catch (Exception e) 大餐
try {
    FileInputStream fis = new FileInputStream("config.xml");
    // ...
} catch (FileNotFoundException e) {
    log.error("配置文件缺失", e);
    throw new BusinessException("系統初始化失敗: 配置文件缺失", e); // 包裝轉拋
} catch (IOException e) {
    log.error("讀取配置失敗", e);
    throw new BusinessException("系統初始化失敗: 讀取錯誤", e);
}

// 2. finally / try-with-resources 確保資源釋放 (JDK 7+ 推薦)
try (InputStream is = new FileInputStream("data.txt")) {
    // 讀取...
} // 自動調用 is.close()

// 3. 自定義異常:繼承 Exception (Checked) 或 RuntimeException (Unchecked)
public class BusinessException extends RuntimeException { // 多為 Unchecked,減少 throws 污染
    private String errorCode;
    public BusinessException(String msg, String code, Throwable cause) { super(msg, cause); this.errorCode = code; }
}

六、 總結

  • Error:不捕獲,靠運維監控。
  • Checked Exception:強制處理,體現「失敗是常態」,調用者必須面對。
  • RuntimeException:編程錯誤,靠代碼質量 (單測、Code Review、靜態分析) 預防,不寫 `try-catch` 也合法。
  • 原則:具體捕獲、包裝轉拋、資源自動關閉、自定義異常攜帶錯誤碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved