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

Java 異常處理全解析:分類、機制、最佳實踐與自定義異常

     編輯:Java 相關知識

Error vs Exception:根本區別

類別代表處理策略
ErrorJVM 層面:OOM、StackOverflow、類載入失敗程式無法恢復,建議直接終止
Exception應用層面:業務邏輯可預期/可處理應捕獲處理,讓程式繼續運行

受檢 vs 非受檢異常

  • Checked Exception:繼承 Exception(非 RuntimeException),編譯期強制 try-catch 或 throws。如 IOException、SQLException
  • Unchecked Exception:繼承 RuntimeException,編譯期不強制。如 NullPointerException、ArithmeticException

五大關鍵字機制詳解

1. try-catch-finally 結構規則

  • try 必須存在,catch/finally 至少一個
  • 多 catch 由上至下匹配,子類異常需置前
  • finally 無論是否異常皆執行(除 System.exit())

2. return 與 finally 執行順序陷阱

public static int test() {
    try {
        return 1;
    } catch (Exception e) {
        return 2;
    } finally {
        return 3; // 覆蓋前面所有 return,最終結果為 3
    }
}

結論:finally 中的 return/拋異常會覆蓋 try/catch 的返回值,慎用。

3. throws:向上拋給呼叫者

public void readFile() throws FileNotFoundException {
    new FileInputStream("a.txt");
}

呼叫者必須 try-catch 或繼續 throws。重寫方法時,子類拋出的受檢異常必須 ≤ 父類(類型與數量)。

4. throw:主動拋出異常實例

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("流程結束"); }
}

避坑指南

  1. 不要濫用 try-catch 包裹大段代碼,導致異常定位困難
  2. 捕獲異常後務必記錄堆疊追蹤(e.printStackTrace() 或日誌框架)
  3. 資源關閉放入 finally 或使用 try-with-resources (Java 7+)
  4. 區分業務異常(受檢)與程式錯誤(非受檢),避免混用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved