概念
在Java中,Exception和Error都是Throwable的子類,用于處理程序中的錯誤和異常情況。
然而,它們在用途和處理方式上有顯著的不同:
Exception:
- 用于表示程序在正常運行過程中可能出現的錯誤,如文件未找到(FileNotFoundException)、網絡連接問題(IOException)等。
- 這些異常可以通過try-catch塊捕捉和處理,使程序能夠優雅地處理錯誤,避免崩潰,并繼續執行。
- Exception分為Checked和Unchecked兩大類。Checked異常在編譯時會進行檢查,編譯器會報錯的,必須處理或聲明;Unchecked異常(如RuntimeException),也就是運行的時候才知道這玩意有問題,我們可以預判進行處理。
- 常見的Exception子類包括IOException、SQLException等。
Error:
- 表示更嚴重的、通常無法恢復的錯誤,如內存不足(OutOfMemoryError)、棧溢出(StackOverflowError)或類找不到(NoClassDefFoundError)。
- 這些錯誤通常來自系統或JVM層面的問題,超出應用程序的控制范圍,處理起來非常困難,甚至可能無法繼續運行。
- 通常,Error不會被顯式捕捉,因為它們標志著程序可能無法繼續運行。在某些情況下,可能嘗試記錄錯誤信息后終止程序。
- 常見的Error子類包括OutOfMemoryError、StackOverflowError和NoClassDefFoundError。
擴展知識
- 優先捕獲具體異常類型,避免直接捕獲Exception。
- 避免在catch塊中不做任何處理;若確實無需處理,建議記錄日志:“根據設計【鏈接地址】,此處異常不做處理”。
- 對空指針等常見異常條件應提前檢查;通過預防減少異常的發生概率。
- 盡量縮小try-catch塊作用域。
- 優先使用if/else替代不必要的異常處理。
- 只捕獲并處理可以有效響應的異常,將無法處理的異常向上拋出,遵循逐層異常處理原則。
- 使用try-finally確保資源可靠釋放。
- 利用try-with語句管理可以自動關閉的資源。
- 避免過度使用異常機制,預防異常比處理異常更重要。
- 避免在finally塊中返回值。
- 不要覆蓋try塊的正常返回邏輯。
- 記錄異常信息時應包含完整堆棧跟蹤。