| 類別 | 代表 | 處理策略 |
|---|---|---|
Error | JVM 層面:OOM、StackOverflow、類載入失敗 | 程式無法恢復,建議直接終止 |
Exception | 應用層面:業務邏輯可預期/可處理 | 應捕獲處理,讓程式繼續運行 |
Exception(非 RuntimeException),編譯期強制 try-catch 或 throws。如 IOException、SQLExceptionRuntimeException,編譯期不強制。如 NullPointerException、ArithmeticExceptiontry 必須存在,catch/finally 至少一個catch 由上至下匹配,子類異常需置前finally 無論是否異常皆執行(除 System.exit())public static int test() {
try {
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3; // 覆蓋前面所有 return,最終結果為 3
}
}
結論:finally 中的 return/拋異常會覆蓋 try/catch 的返回值,慎用。
public void readFile() throws FileNotFoundException {
new FileInputStream("a.txt");
}
呼叫者必須 try-catch 或繼續 throws。重寫方法時,子類拋出的受檢異常必須 ≤ 父類(類型與數量)。
if (str.equals("abc")) throw new IllegalArgumentException("不允許 abc");
public class BizException extends Exception {
public BizException() { super(); }
public BizException(String msg) { super(msg); }
public BizException(String msg, Throwable cause) { super(msg, cause); }
}
建議繼承 Exception(受檢)或 RuntimeException(非受檢),視業務是否需強制處理而定。
// 模式 1:層層 throws 至頂層統一處理
public static void main(String[] args) throws BizException {
new Service().doWork();
}
// 模式 2:就地 try-catch 處理並記錄
public static void main(String[] args) {
try { new Service().doWork(); }
catch (BizException e) { log.error("業務失敗", e); }
finally { System.out.println("流程結束"); }
}
try-catch 包裹大段代碼,導致異常定位困難e.printStackTrace() 或日誌框架)finally 或使用 try-with-resources (Java 7+)