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

Java 異常與 Error 體系完整圖譜與處理實戰

     編輯:Java 相關知識

頂層繼承結構

java.lang.Throwable (實作 Serializable)
├── java.lang.Error          // 嚴重錯誤,不可恢復
└── java.lang.Exception      // 可預期、可處理
     ├── java.lang.RuntimeException  // 非檢查異常
     └── 其他 (IOException 等)       // 檢查異常

Error:系統級災難(不可捕獲處理)

Error 子類典型場景處理策略
OutOfMemoryError堆/元空間/線程棧耗盡調優 JVM 參數、排查記憶體洩漏
StackOverflowError遞歸過深、循環調用改迭代、增大 -Xss
NoClassDefFoundError運行時找不到類(依賴缺失/類加載器問題)檢查 classpath、依賴衝突
LinkageError類版本不兼容統一依賴版本
ThreadDeathThread.stop() 強制終止禁用 stop(),用中斷標誌

鐵律:Error 及其子類 絕不 應出現在 catch 塊中,讓 JVM 崩潰並生成 Dump 供事後分析。

Exception:業務邏輯可控區

檢查異常 - 必須處理

  • IOException、FileNotFoundException、SQLException
  • InterruptedException(線程中斷)
  • ClassNotFoundException(反射載入失敗)
  • ParseException(日期/數字解析失敗)

編譯器強制 try-catch 或 throws,適合「可預期、可恢復」場景。

非檢查異常 - 邏輯 Bug

  • NullPointerException
  • ArrayIndexOutOfBoundsException
  • ClassCastException
  • IllegalArgumentException
  • ArithmeticException(除零)
  • NumberFormatException

繼承 RuntimeException,編譯器不強制處理。核心原則:預防勝於捕獲,通過防禦性編程(判空、邊界檢查、契約前置條件)消除。

異常處理黃金法則

  1. 具體捕獲:catch (IOException e) 而非 catch (Exception e)
  2. 異常鏈保留:throw new BizException("業務失敗", e) 保留堆疊
  3. 資源關閉:JDK 7+ try-with-resources 自動關閉 AutoCloseable
  4. 不吞沒異常:catch (Exception e) { log.error("", e); throw ... } 或重新拋出
  5. 自訂異常:業務異常繼承 RuntimeException(非檢查),系統異常繼承 Exception(檢查)
  6. finally 不要 return/throw:會掩蓋原異常

父子類異常覆寫規則

class Parent {
    void method() throws IOException {} // 拋檢查異常
}
class Child extends Parent {
    @Override
    void method() throws FileNotFoundException {} // ✅ 子類異常 ⊆ 父類異常
    // void method() throws Exception {} // ❌ 父類異常 ⊂ 子類異常,編譯錯誤
    // void method() {} // ✅ 不拋異常也合法
}

構造器特殊:子類構造器 throws 必須 包含 父類構造器異常(因隱式 super())。

總結

Java 異常體系設計精妙:Error 給 JVM,RuntimeException 給程式員(修 Bug),Checked Exception 給調用者(處理業務分支)。掌握分類邏輯與處理模式,是寫出健壯代碼的分水嶺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved