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

深入解析 Java 內建異常與自訂異常類別設計

     編輯:Java 相關知識

異常處理是 Java 程式健壯性的基石。掌握 JDK 內建異常體系,並能根據業務需求設計自訂異常,是進階開發者的必備技能。本文系統梳理 java.lang 異常階層,並示範自訂異常的最佳實踐模式。

一、Java 內建異常體系速覽

所有異常繼承自 java.lang.Throwable,主要分為兩大分支:

1. Error(錯誤)

代表 JVM 層面的嚴重問題(如 OutOfMemoryError, StackOverflowError),通常不可恢復,應用程式不應嘗試捕捉處理。

2. Exception(異常)

分為受檢異常與非受檢異常:

類別特徵常見範例處理方式
受檢異常
(Checked Exception)
繼承 Exception 但非 RuntimeException;編譯器強制要求 try-catch 或 throws 聲明IOException, SQLException, ClassNotFoundException預期可恢復的錯誤,必須顯式處理
非受檢異常
(Unchecked Exception)
繼承 RuntimeException;編譯器不強制檢查NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException, IllegalArgumentException程式邏輯錯誤,應透過修正代碼避免,而非捕捉

二、為何需要自訂異常?

  • 語義精確:用 InsufficientBalanceException 取代通用的 RuntimeException,讓呼叫端明確知曉業務失敗原因。
  • 攜帶上下文:自訂欄位(如錯誤代碼、失敗的交易 ID)便於日誌追蹤與前端友善提示。
  • 分層解耦:DAO 層拋出 DataAccessException,Service 層轉為 BusinessException,Controller 統一映射 HTTP 狀態碼。

三、自訂異常最佳實踐範本

/**
 * 業務異常基類:攜帶錯誤代碼與動態訊息
 */
public class BizException extends RuntimeException {
    private final int code;

    public BizException(int code, String message) {
        super(message);
        this.code = code;
    }

    public BizException(int code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }

    public int getCode() { return code; }
}

/**
 * 具體業務異常:餘額不足
 */
public class InsufficientBalanceException extends BizException {
    public InsufficientBalanceException(String accountId, double balance, double amount) {
        super(1001, String.format("帳戶 %s 餘額 %.2f 不足以支付 %.2f", accountId, balance, amount));
    }
}

/**
 * 使用範例:轉帳服務
 */
public class TransferService {
    public void transfer(String from, String to, double amount) {
        Account fromAcc = accountRepo.findById(from);
        if (fromAcc.getBalance() < amount) {
            // 直接拋出業務異常,無需捕捉 SQLException 等底層異常
            throw new InsufficientBalanceException(from, fromAcc.getBalance(), amount);
        }
        // ... 扣款邏輯
    }
}

四、關鍵設計原則

  1. 優先繼承 RuntimeException:除非呼叫端必須強制處理(如檢核式 API),否則用非受檢異常減少樣板碼。
  2. 提供多種建構子:支援 message、cause、code 組合,保留堆疊追蹤鏈。
  3. 不可變性:錯誤代碼、訊息欄位設為 final,執行緒安全。
  4. 命名規範:以 Exception 結尾;模組前綴區分域(如 OrderException, PaymentException)。
  5. 避免過度設計:簡單專案用標準異常(IllegalArgumentException, IllegalStateException)即可,切勿為每個錯誤建立類別。

五、Throwable 核心方法速查

自訂異常繼承自 Throwable,常用方法:

  • getMessage():詳細描述
  • getLocalizedMessage():本地化描述(可覆寫)
  • getCause():根因異常(鏈式追蹤關鍵)
  • printStackTrace():輸出堆疊到標準錯誤流
  • getStackTrace():程式化存取堆疊幀(StackTraceElement[])

結語

善用內建異常處理通用錯誤,關鍵業務流程引入語義豐富的自訂異常,並配合全域異常處理器(@ControllerAdvice / @ExceptionHandler)實現統一錯誤回應,能顯著提升系統可維護性與排錯效率。

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