在 Java 中所有的例外都屬於 Throwable 的物件,但 Throwable 又分為兩大類: Error 以及 Exception。 而 Error 與 Exception 皆繼承自 Throwable 類別。
簡單的 Error 與 Exception,可以說:
(1) Error 大多是系統本身發出的錯誤,可預期。
(2) 而 Exception 大多發生在程式有錯, 執行期間發生錯誤的時候,通常不可預期。
另外
我們可以從可檢測例外 (checked) 以及不可檢測例外來 (un-checked) 來區分例外:
(1) 可檢測例外: 有點像是白名單的感覺,如果發生了,大概知道是什麼情況,在理解範圍內可預料的失敗狀況。
(2) 不可檢測例外: 可能是程式執行期間發生狀況, 或是系統資源不足, 或是函式庫的弊病, 或是環境設定上等等,舉個例子來說,目前沒有什麼好方法可以預測 OutOfMemoryError。
至於 Throwable 底下哪些算是不可檢測例外?
(1) 屬於 Error 的都是不可檢測例外。常見如: StackOverFlowError, OutOfMemoryError, NoClassFoundError。
(2) Exception 的子類別 RuntimeException 以及 RuntimeException 的子類別也都屬於不可檢測例外。(RuntimeException 常見的有: NullPointException, IndexOutOfBoundsException, IllegalArgumentException…等等。)
其他沒有提到的都屬於可檢測例外,例如: IOException, SQLException, ClassNotFoundException… 等等。
處理例外
假如是 checkedException,表示此例外為可檢測例外,基本上可以使用 try catch 的區塊處理,或是 throws 拋出。
假如是 UncheckedException,表示不可檢測例外,某些情況你也可以使用 try, catch, throws (假如是接到數學算式錯誤, 陣列個數有問題, null 指標問題等等,就可以處理),但也有可能是記憶體不夠, JVM 有問題等等之類的例外,則不建議做例外處理,適當地讓錯誤反應出來。
讀書筆記參考自:
《JAVA 技術手冊第六版 》- P. 72
《猛虎出柙雙劍合璧版》 - 第四章 Java 例外處理機制。
沒有留言:
張貼留言
若你看的文章,時間太久遠的問題就別問了,因為我應該也忘了... XD