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

Java 異常處理實戰練習:自定義異常、運行時異常與業務邏輯解耦

     編輯:Java 綜合教學

需求場景

計算圓形和矩形面積,半徑/長寬非法時拋出異常,演示異常體系設計。

代碼實現

// 1. 自定義業務異常(繼承 RuntimeException 免受檢查)
class InvalidDimensionException extends RuntimeException {
    public InvalidDimensionException(String message) {
        super(message);
    }
}

// 2. 形狀接口
interface Shape {
    void getArea(); // 無參:屬性已在構造器初始化
}

// 3. 圓形實現
class Circle implements Shape {
    private final int radius;
    public static final double PI = 3.14;

    public Circle(int radius) {
        if (radius < 0) throw new InvalidDimensionException("半徑不能為負數: " + radius);
        this.radius = radius;
    }

    @Override
    public void getArea() {
        System.out.println("圓面積: " + (radius * radius * PI));
    }
}

// 4. 矩形實現
class Rectangle implements Shape {
    private final int length, width;

    public Rectangle(int length, int width) {
        if (length <= 0 || width <= 0) 
            throw new InvalidDimensionException("長寬必須大於 0: " + length + "," + width);
        this.length = length;
        this.width = width;
    }

    @Override
    public void getArea() {
        System.out.println("矩形面積: " + (length * width));
    }
}

// 5. 測試類
public class ExceptionDemo {
    public static void main(String[] args) {
        try {
            Shape rect = new Rectangle(3, 4);
            rect.getArea(); // 正常輸出 12
            
            Shape circle = new Circle(-5); // 拋出異常
            circle.getArea(); // 不會執行
        } catch (InvalidDimensionException e) {
            System.err.println("業務異常: " + e.getMessage());
        } finally {
            System.out.println("程序結束");
        }
    }
}

核心設計原則

  1. 自定義異常語義化:InvalidDimensionException 明確表達業務錯誤類型,優於通用 RuntimeException
  2. 構造器驗證失敗快:在對象創建時即檢查參數合法性,避免無效對象流入系統 不可變對象:final 字段 + 構造器賦值,保證線程安全與領域模型純粹性 異常分層:業務異常繼承 RuntimeException,控制層統一捕獲轉換為用戶友好提示,避免污染 Service 代碼 Finally 保障收尾:資源釋放、日誌記錄、狀態重置放入 finally

進階擴展:檢查型異常 vs 非檢查型異常

維度Checked ExceptionUnchecked Exception (RuntimeException)
編譯器強制必須 try-catch 或 throws無強制要求
適用場景可恢復的業務邏輯(如文件不存在、余額不足)編程錯誤、不可恢復系統錯誤、參數非法
代碼侵入性高(層層 throws)低
推薦策略Controller 層捕獲轉換Service/DAO 直接拋出,全局異常處理器捕獲
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved