異常是程序運行過程中發生的非正常情況。Java 通過完善的異常體系提供統一錯誤處理機制。本文系統梳理異常分類、層次結構、核心方法、捕獲語法、自定義異常及實戰最佳實踐。
| 類別 | 特點 | 處理要求 | 典型例子 |
| 檢查性異常 | 編譯期檢查,外部因素導致 | 強制 try-catch 或 throws | IOException、SQLException |
| 運行時異常 | 邏輯錯誤,可通過代碼避免 | 編譯期不強制 | NullPointerException、ArrayIndexOutOfBoundsException |
| 錯誤 | JVM/系統級故障,不可恢復 | 一般不捕獲 | OutOfMemoryError、StackOverflowError |
異常繼承體系
Throwable
├── Error // 錯誤:系統級,不處理
└── Exception // 異常:程序級
├── RuntimeException // 運行時異常(非檢查性)
│ ├── NullPointerException
│ ├── IllegalArgumentException
│ └── ...
└── IOException // 檢查性異常
├── SQLException
├── ClassNotFoundException
└── ...

Throwable 核心方法
| 方法 | 說明 |
| getMessage() | 詳細錯誤信息 |
| getCause() | 根因異常 |
| toString() | 類名 + 信息 |
| printStackTrace() | 打印堆棧到 System.err |
| getStackTrace() | 獲取 StackTraceElement 數組 |
| fillInStackTrace() | 重新填充堆棧軌跡 |
異常捕獲語法
try {
// 保護代碼
} catch (ExceptionType1 e1) {
// 處理類型1
} catch (ExceptionType2 e2) {
// 處理類型2
} finally {
// 清理代碼(無論是否異常都執行)
}
多重 Catch 最佳實踐
- 子類異常在前,父類在後(否則編譯錯誤/不可達)
- Java 7+ 多 Catch 合併:
catch (IOException | SQLException e)
- try-with-resources 自動關閉實現 AutoCloseable 的資源
throws vs throw
throws:方法簽名聲明拋出的檢查性異常,調用者負責處理
throw:主動拋出異常實例:throw new BusinessException("庫存不足")
自定義異常規範
// 業務檢查性異常
public class InsufficientFundsException extends Exception {
private double amount;
public InsufficientFundsException(double amount) {
super("餘額不足,需額外: " + amount);
this.amount = amount;
}
public double getAmount() { return amount; }
}
// 業務運行時異常(推薦:繼承 RuntimeException,減少 throws 傳播)
public class BusinessException extends RuntimeException {
private int code;
public BusinessException(int code, String msg) {
super(msg); this.code = code;
}
}
實戰最佳實踐
- 異常分層:DAO 拋 SQLException → Service 包裝為 BusinessException → Controller 統一處理返回錯誤碼
- 不吞沒異常:catch 後至少記錄日志,或包裝重拋
- 提供上下文:自定義異常攜帶關鍵業務數據(訂單ID、用戶ID)
- 避免流程控制用異常:異常開銷大,業務判斷用條件語句
- finally 清理資源:或用 try-with-resources
- 全局異常處理:Spring
@ControllerAdvice + @ExceptionHandler 統一返回 JSON 錯誤
常見內置異常速查
| 異常 | 觸發場景 |
| NullPointerException | 調用 null 對象方法/字段 |
| ArrayIndexOutOfBoundsException | 數組索引越界 |
| ClassCastException | 強轉類型不兼容 |
| IllegalArgumentException | 方法參數非法 |
| NumberFormatException | 字符串轉數字失敗 |
| ClassNotFoundException | 類加載失敗 |
總結
異常處理核心是「失敗快速、信息完整、責任清晰」。區分檢查性/運行時異常、合理自定義業務異常、分層包裝轉換、全局統一處理,構建健壯可維護的錯誤處理體系。
- 上一篇文章: HashMap 實現原理深度解析與手寫簡易版:數組+鏈表、擴容、Hash 算法優化
- 下一篇文章: Java Web 防止表單重復提交:Token 令牌機制完整實現與工具類封裝
Copyright ©
程式碼之家 All Rights Reserved