java異常體系通過類的繼承結構組織,頂層為throwable類,其下分為Error和exception。1. error表示jvm嚴重問題,通常不捕獲;2. exception用于程序異常,分為受檢異常(如ioexception)需顯式處理,和非受檢異常(如nullpointerexception)源自runtimeexception,編譯器不強制處理。實際開發中應捕獲具體異常、合理自定義異常類型、避免忽略異常及在finally塊拋出異常,以提升代碼健壯性。
Java中的異常體系是通過類的繼承結構來組織的,這樣設計的好處是可以對不同類型的錯誤進行分類處理。整個異常體系的頂層是一個叫做 Throwable 的類,它位于所有異常和錯誤的最頂端。
Throwable 是所有異常的起點
在 Java 中,Throwable 是所有異常類的父類,也就是說,不管是運行時錯誤還是程序可以捕獲并處理的異常,都必須繼承自 Throwable。這個類有兩個直接子類:
- Error
- Exception
其中:
立即學習“Java免費學習筆記(深入)”;
- Error 代表的是 JVM 出現的嚴重問題,比如 OutOfMemoryError、StackoverflowError 等,通常我們不會去捕獲這類錯誤。
- Exception 才是我們日常開發中最常打交道的部分,它是程序中可能出現的各種異常的基類。
Exception 及其常見子類
Exception 類本身又分為兩個大類:
- 受檢異常(Checked Exceptions)
- 非受檢異常(Unchecked Exceptions)
受檢異常是指在編譯階段就會被檢查的異常,比如 IOException、SQLException 等,如果你的方法可能會拋出這些異常,就必須顯式地處理它們(try-catch 或 throws 聲明)。
而非受檢異常則是繼承自 RuntimeException 的異常,例如 NullPointerException、ArrayIndexOutOfBoundsException,它們通常是因為程序邏輯錯誤引起的,編譯器不要求你必須處理。
所以,完整的繼承鏈大致如下:
Throwable ├── Error └── Exception ├── IOException ├── SQLException └── RuntimeException ├── NullPointerException ├── IllegalArgumentException └── ...
如何正確使用異常體系?
理解異常的繼承關系之后,在實際開發中我們可以更合理地使用異常處理機制:
- 捕獲具體異常比捕獲通用異常更好。比如優先 catch IOException 而不是籠統的 Exception。
- 自定義異常時,根據需要選擇繼承 Exception(受檢)還是 RuntimeException(非受檢)。
- 不要輕易忽略異常,即使只是記錄日志也比什么都不做強。
- 避免在 finally 塊中拋出異常,否則可能覆蓋 try 塊中的異常信息。
基本上就這些。了解 Java 異常的繼承結構,有助于寫出更健壯、可維護的代碼。