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

Java 異常處理核心架構與常見陷阱避坑指南

     編輯:Java 相關知識

前言

異常處理是 Java 程式設計的基石,但許多開發者僅停留在 try-catch-finally 基本語法,忽略了異常體系架構、檢查型與非檢查型異常的選擇哲學、以及資源釋放的隱藏陷阱。本文系統梳理異常架構,剖析經典錯誤案例,提供四大最佳實踐建議。

異常體系架構

java.lang.Throwable
├── java.lang.Error          // 嚴重錯誤,應用不應捕獲(如 OutOfMemoryError)
└── java.lang.Exception
    ├── 檢查型異常           // 必須宣告 throws 或捕獲(如 IOException)
    └── 非檢查型異常         // RuntimeException 及其子類,編譯器不強制檢查

關鍵點:ThreadDeath 雖屬 Error,但不應捕獲,捕獲會導致線程無法正常終止。

檢查型 vs 非檢查型:何時用哪種?

  • 檢查型異常:呼叫者**可合理恢復**的情況(如檔案不存在、網路中斷)。強制呼叫者處理,提升 API 契約明確性。
  • 非檢查型異常:程式邏輯錯誤、不可恢復的系統故障(如 NullPointerException, IllegalArgumentException)。不應強制呼叫者捕獲,讓其向上冒泡至全域處理器。
  • 共識:混合使用,避免濫用檢查型異常導致程式碼充滿 throws 與空 catch 區塊。

經典陷阱:finally 區塊中的 NullPointerException

InputStream input = null;
try {
    input = new FileInputStream("myFile.txt"); // 若檔案不存在,拋 FileNotFoundException
    // do something
} catch (IOException e) {
    throw new WrapperException(e); // 準備拋出包裝異常
} finally {
    try {
        input.close(); // 此處 input 為 null!拋出 NullPointerException
    } catch (IOException e) {
        throw new WrapperException(e);
    }
}

結果:原本的 FileNotFoundException 被 NullPointerException **掩蓋**,導致錯誤診斷困難。

正確寫法

InputStream input = null;
try {
    input = new FileInputStream("myFile.txt");
    // do something
} catch (IOException e) {
    throw new WrapperException(e);
} finally {
    if (input != null) { // 必須檢查非 null
        try { input.close(); } catch (IOException ignored) {}
    }
}

或使用 Java 7+ **try-with-resources** 自動關閉:

try (InputStream input = new FileInputStream("myFile.txt")) {
    // do something
} catch (IOException e) {
    throw new WrapperException(e);
}

四大異常處理最佳實踐

  1. 包裝與擴展捕獲的異常:保留原始堆疊追蹤,添加業務上下文資訊,轉換為自訂異常層級。
  2. 定義自訂異常處理介面:統一錯誤碼、訊息格式、日誌記錄策略,便於前端呈現與監控告警。
  3. 在最外層捕獲並記錄異常日誌:避免重複記錄、日誌遺失;使用 AOP 或 Servlet Filter 統一處理。
  4. 使用異常處理模板:封裝通用 try-catch-finally 流程,減少樣板程式碼,確保資源正確釋放。

結語

異常不僅是錯誤信號,更是 API 契約的一部分。理解異常體系、避開資源釋放陷阱、建立統一處理機制,能讓系統在異常發生時仍保持穩健、可觀測、易維護。

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