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

Java 異常處理完全指南:體系架構、捕獲策略與最佳實踐

     編輯:Java 相關知識

異常體系總覽

所有異常繼承自 java.lang.Throwable,分三大類:

  • 受檢異常:Exception 子類(非 RuntimeException)。編譯器強制 try-catch 或 throws。例:IOException、SQLException。代表外部環境問題(檔案不存在、網路中斷)。
  • 執行期異常:RuntimeException 子類。編譯器不強制處理。例:NullPointerException、ArrayIndexOutOfBoundsException、IllegalArgumentException。代表程式邏輯 Bug,應修正代碼而非捕獲。
  • 錯誤:Error 子類。嚴重系統級問題(OutOfMemoryError、StackOverflowError),應用程式通常無法恢復,交由 JVM/運行環境處理。

兩種處理方式

  1. 就地處理: try-catch-finally 包裹風險代碼。
  2. 向上拋出: 方法簽名加 throws XxxException,讓呼叫者決定如何處理。

核心語法詳解

1. try-catch-finally

try {
    int x = (int)(Math.random()*5);
    int y = (int)(Math.random()*10);
    int[] z = new int[5];
    System.out.println("y/x=" + (y/x));
    System.out.println("z[y]=" + z[y]);
} catch (ArithmeticException e) {
    System.out.println("算術異常:" + e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("索引越界:" + e.getMessage());
} finally {
    System.out.println("無論如何都會執行(除非 JVM 退出)");
}
  • 捕獲順序: 子類異常必須寫在父類之前,否則編譯錯誤(如先 catch Exception 再 catch IOException 會報錯)。
  • finally 必執行,除非: JVM 退出(System.exit())、執行緒死亡、finally 內部拋異常、CPU 掛掉。

2. 自訂異常與拋出

// 定義
public class BusinessException extends Exception {
    public BusinessException(String msg) { super(msg); }
}

// 拋出(標準範式:建立與拋出合一行,保留堆疊資訊)
throw new BusinessException("餘額不足");

// 方法聲明拋出
public void withdraw(double amt) throws BusinessException { ... }

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

try (FileInputStream fis = new FileInputStream("a.txt");
     BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
    String line = br.readLine();
} // 自動關閉,無需 finally 手動 close

實作 AutoCloseable 的資源皆適用,程式碼更簡潔安全。

異常處理黃金法則

  1. 不要吞沒異常: catch (Exception e) { } 是大忌,至少要 log.error。
  2. 具體捕獲: 盡量捕獲精確異常類別,避免捕獲 Exception 或 Throwable。
  3. 向上拋出原則: 底層不懂業務語境時,直接 throws,由最上層(Controller/服務入口)統一轉換為使用者友善訊息、記錄日誌、決定重試或回滾。
  4. 區分業務異常與系統異常: 業務異常(如餘額不足)用受檢異常強制處理;系統異常(如 DB 掛掉)包裝為非受檢異常向上拋,由全域異常處理器攔截。
  5. 保留堆疊: 拋出新異常時用 throw new XxxException("msg", cause) 串聯原始原因。

常見反模式

  • 用異常控制流程(如用 try-catch 判斷 Map 是否有 key)。
  • 在迴圈裡拋出/捕獲異常(效能極差)。
  • 捕獲後只 e.printStackTrace() 卻不記錄到日誌系統。

掌握異常體系與處理策略,能讓程式在面對不可預期情況時,依然保持穩健、可追蹤、易維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved