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

Java 例外處理十大常見問題深度解析與最佳實踐

     編輯:Java 綜合教學

例外體系速覽

Java 例外階層圖

  • 受檢例外:必須 try-catch 捕獲或 throws 拋出(如 IOException),強制 API 使用者處理。
  • 非受檢例外:RuntimeException 及其子類(如 NullPointerException、ArithmeticException),通常為程式邏輯錯誤,無法合理復原。

十大常見問題詳解

1. 受檢 vs 非受檢:如何選擇?

呼叫者能夠合理處理 → 受檢例外(如檔案不存在、網路中斷)
呼叫者無法處理/屬於程式錯誤 → 非受檢例外(如參數驗證失敗、除零)

2. 例外管理最佳實踐

「當前能妥善處理 → 捕獲處理;無法處理 → 明確拋出,讓上層決定」

3. try 區塊變數在 catch/finally 不可見?

try {
    File file = new File("path");
    FileInputStream fis = new FileInputStream(file);
    String s = "inside";  // 可能拋出例外前就宣告,但編譯器不保證執行到這行
} catch (FileNotFoundException e) {
    System.out.println(s); // 編譯錯誤:s 可能未初始化
}

原因:編譯器無法確認 s 宣告前是否已拋出例外。解法:在 try 外宣告並初始化為 null。

4. Integer.parseInt(null) vs Double.parseDouble(null) 拋出不同例外?

Integer.parseInt(null);   // NumberFormatException
Double.parseDouble(null); // NullPointerException (JDK 7 前)

早期 JDK 實作不一致,屬實作細節差異。現代 JDK (7+) 統一拋出 NumberFormatException。無需深究,統一捕獲 NumberFormatException 即可。

5. 善用執行期例外表達契約

public void setAge(int age) {
    if (age < 0 || age > 150)
        throw new IllegalArgumentException("年齡必須在 0-150 之間: " + age);
    this.age = age;
}

常用:IllegalArgumentException、IllegalStateException、IndexOutOfBoundsException、UnsupportedOperationException。

6. 單一 catch 捕獲多種例外

  • Java 7+ 多重捕獲:catch (IOException | SQLException ex) { ... }
  • 捕獲共同父類:catch (Exception e)(謹慎使用,避免吞沒錯誤)
  • Java 7 前:捕獲 Exception 後用 instanceof 判斷分派

7. 建構子可以拋出例外嗎?

可以。若建構子拋出例外,物件不會被建立,記憶體由 GC 回收。適用於驗證建構參數有效性。

8. finally 區塊也能拋出/捕獲例外

finally {
    try {
        cleanup();
    } catch (IOException e) {
        log.error("清理失敗", e); // 建議封裝成方法提升可讀性
    }
}

注意:若 try 與 finally 都拋出例外,try 的例外會被 finally 的例外覆蓋遺失(Java 7+ 可用 addSuppressed 保留)。

9. finally 可以寫 return 嗎?

可以,但極度不建議。finally 的 return 會覆蓋 try/catch 的回傳值,導致極難除錯的邏輯錯誤。

10. 為何開發者常「吞沒」例外?

try { ... } catch (Exception e) { e.printStackTrace(); } // 只印堆疊,無實質處理

原因:IDE 快速修復產生樣板碼、趕工期、不確定如何處理。
後果:錯誤被隱藏、難以追蹤、系統狀態不一致。
原則:無法處理 → 拋出;能處理 → 完整處理(記錄、重試、補償、轉換為業務例外)。

核心原則總結

  1. 例外是控制流程的一部分,而非錯誤借口
  2. 受檢例外強制 API 契約,非受檢例外揭露程式缺陷
  3. 捕獲即承擔處理責任,不可輕易吞沒
  4. finally 專為資源清理設計,勿濫用控制流程
  5. 自訂例外類別豐富領域語言,提升錯誤訊息可讀性

原文連結:ProgramCreek 翻譯版

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