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

Java 異常體系深度解析:Error 與 Exception 的本質區別

     編輯:Java 相關知識

繼承體系一覽

Throwable
├── Error          // 系統級嚴重問題,通常不可恢復
└── Exception      // 應用級問題,可處理
    ├── RuntimeException (Unchecked)  // 邏輯錯誤,編譯器不強制處理
    └── Checked Exception             // 外部依賴/資源錯誤,編譯器強制處理

Error 繼承樹 Exception 繼承樹 完整異常繼承圖

核心區別對照表

維度ErrorException
性質系統級/資源耗盡/VM 故障應用程式邏輯/外部依賴錯誤
可控性全為 Unchecked(繼承 Error)分 Checked / Unchecked (RuntimeException)
典型例子OutOfMemoryError、StackOverflowError、NoClassDefFoundErrorIOException、SQLException、NullPointerException、IllegalArgumentException
處理策略系統層面監控/重啟/擴容,**代碼不應捕獲處理**應用層面 try-catch/throws/全局異常處理器
發生階段運行時(JVM 內部)編譯期檢查 或 運行時拋出

Checked vs Unchecked 深度解析

Checked Exception(受檢異常)

  • 繼承 Exception 但非 RuntimeException。
  • 編譯器強制:方法簽名必須 throws 或 try-catch 處理。
  • 代表:IOException、SQLException、ClassNotFoundException。
  • 優點:API 使用者感知潛在失敗。缺點:過度使用導致異常傳播鏈冗長、耦合度高、樣板代碼多。

Unchecked Exception(非受檢異常)

  • 繼承 RuntimeException。
  • 編譯器不強制處理,運行時拋出。
  • 代表:NullPointerException、IllegalArgumentException、IndexOutOfBoundsException、ArithmeticException。
  • 本質:程式設計錯誤(Bug),應通過防禦性編程/契約先驗證避免,而非捕獲處理。

實戰最佳實踐

  1. 異常分層:DAO 層捕獲 SQLException → 包裝為非受檢 DataAccessException → Service 層轉為業務異常 → Controller 統一處理返回錯誤碼。
  2. 不要吞沒異常:catch (Exception e) { } 是大忌;至少記錄日誌 log.error("msg", e)。
  3. 優先使用標準異常:IllegalArgumentException(參數非法)、IllegalStateException(狀態非法)、UnsupportedOperationException。
  4. 自定義異常:繼承 RuntimeException(業務邏輯錯誤)或 Exception(可恢復的受檢場景),提供錯誤碼、上下文資訊。
  5. 資源管理用 try-with-resources:JDK 7+ 自動關閉 AutoCloseable,避免 finally 繁瑣且易漏關閉。

常見誤區澄清

❌ 「Error 也要 catch 處理」 → 錯。OOM 時 catch 也無法恢復,應配置堆內存、排查洩漏、設置 JVM 參數 -XX:+HeapDumpOnOutOfMemoryError。

❌ 「所有 Exception 都要 throws」 → 錯。RuntimeException 及其子類不應出現在 throws 子句,污染介面。

❌「用 Exception 控制流程」 → 錯。異常開銷大(填充堆疊追蹤),僅用於異常情況。

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