Java 異常處理是軟體開發與測試腳本編寫中不可或缺的關鍵環節,它直接決定了軟體的穩定性與健壯性。本文將深入剖析 Java 異常處理的核心原理、類別層級架構、最佳實踐模式,並透過實際程式碼範例展示如何在專案中靈活運用異常機制,助您構建更可靠的 Java 應用程式。
看似完美的程式碼在執行時可能遭遇各種不可預期的狀況:鍵盤故障、I/O 讀取失敗、網路中斷、資料庫連線超時等。Java 採用異常機制來應對這些潛在錯誤,強制開發者在編譯階段就正視並處理這些風險,而非等到執行時才發現問題。
以經典的控制台輸入範例為例,呼叫 BufferedReader.readLine() 方法時,編譯器會強制要求處理 IOException,因為底層涉及作業系統、JVM 與硬體的多層互動,任何一環失效都可能導致讀取失敗。
使用 try-catch 區塊在當下攔截並處理異常:
try {
String inputLine = inputReader.readLine();
System.out.println("Read: " + inputLine);
} catch (IOException exc) {
System.out.println("Exception encountered: " + exc);
}
在方法簽名中使用 throws 關鍵字,將處理責任向上傳遞給呼叫者:
public static void main(String args[]) throws IOException {
String inputLine = inputReader.readLine();
System.out.println("Read: " + inputLine);
}

Java 異常類別繼承體系
OutOfMemoryError),通常無法恢復IOException、SQLExceptionNullPointerException、ArrayIndexOutOfBoundsException,無須強制處理try {
// 可能拋出異常的程式碼
String inputLine = inputReader.readLine();
System.out.println("Read: " + inputLine);
} catch (IOException exc) {
// 異常處理邏輯
System.out.println("Exception encountered: " + exc);
} finally {
// 無論是否發生異常都會執行,適用於資源釋放
System.out.println("End.");
}
關鍵規則:
try 後必須跟隨至少一個 catch 或 finallycatch 按照子類優先、父類後置的順序排列finally 區塊幾乎總會執行(除非 JVM 退出、斷電等極端情況)編譯器強制要求處理或聲明,代表外部環境不可控的風險(檔案操作、網路通訊、資料庫存取)。
包含 RuntimeException 與 Error,通常源於程式邏輯缺陷或 JVM 故障,重點在於預防而非捕獲。
針對業務領域定義專屬異常類別,攜帶豐富上下文資訊:
class InsufficientFundsException extends Exception {
private Bank bank;
private double amount;
public InsufficientFundsException(Bank bank, double amount) {
this.bank = bank;
this.amount = amount;
}
public String getMessage() {
return "Balance: " + bank.getBalance() + ", Withdrawal: " + amount;
}
}
catch (Exception e) {} — 等同於掩耳盜鈴catch (Exception e) 處理所有異常 — 失去精準處理能力Exception — 丟失關鍵診斷資訊// 業務異常定義
class InsufficientFundsException extends Exception {
private final String accountId;
private final double balance;
private final double requested;
public InsufficientFundsException(String accountId, double balance, double requested) {
this.accountId = accountId;
this.balance = balance;
this.requested = requested;
}
// getter 方法...
}
// Service 層聲明拋出
public void transfer(String from, String to, double amount) throws InsufficientFundsException {
Account fromAcc = accountDao.find(from);
if (fromAcc.getBalance() < amount) {
throw new InsufficientFundsException(from, fromAcc.getBalance(), amount);
}
// 執行轉帳邏輯...
}
// Controller 層捕獲並轉換為使用者友善訊息
try {
transferService.transfer(from, to, amount);
} catch (InsufficientFundsException e) {
log.warn("Transfer failed: {}", e.getMessage());
throw new BusinessException("INSUFFICIENT_BALANCE", "餘額不足,當前餘額:" + e.getBalance());
}
Java 異常處理不僅是語法要求,更是軟體工程品質的基石。掌握異常層級架構、遵循處理原則、杜絕反模式、善用自訂異常承載業務語義,能讓您的程式碼在面對真實世界的不確定性時,展現出專業級的穩健與可維護性。