開頭
Java中的例外分為受檢例外與非受檢例外(RuntimeExcetption)兩大類,可以先看到這張圖。
所謂的非受檢例外就是指繼承了RuntimeException的Exception,這類的Exception發生,而非受檢例外就是指沒有繼承RuntimeException的Exception。可以看下列的圖片
何謂受檢例外與非受檢例外
受檢例外之所以叫受檢例外,就在於這些例外是工程師必須明確檢查並處理的例外,例如讀取檔案時發生的FileNotFoundException,這類的Exception,JVM沒有辦法進行處理,因此需要工程師去做處理。而RumtimeException則是指那些工程師不需要去明確處理的Exception,比如說NullPointerException, ArrayIndexOutOfBoundsException,這類的例外都是繼承自RuntimeException,可以由JVM進行處理,當然要處理也是可以的,比如說這樣
(可以看到左邊第13行的方法,沒有被try..catch包住也沒事,因為該方法拋出的例外是NumberFormatException,這個例外繼承了RuntimeException,因此不用try…catch處理也沒關係,JVM會自動幫我們處理,如果要放到try…catch的話,則是在catch段裡去catch NumberFormatException)
將方法放入try…catch之後,因為catch是抓RuntimeException,所以被抓到後會print出catch error。
另外比較實務上的說法即是,受檢例外(checked Exception)是可被修復的例外,可以試看看retry,而不可修復的例外就是非受檢例外(RunTimeException),這種時候就代表程式出了問題,有bug,需要工程師下來進行處理,把問題處理掉
來源:2021 IT 鐵人 Day 09 單元測試與例外處理
那如果一個method會拋出受檢例外,而在該method中又沒有做處理,則會需要呼叫它的那一個method進行處理。
右邊的方法實際上不會拋出IOException,所以會顯示為灰色的,這邊只是作為Demo先寫上去。可以看到畫面左邊的地方,此時IDE跟我們報錯,說這個方法會拋出一個IOException,要我們進行處理,因為IOException是一個受檢例外,JVM本身沒有能力可以進行處理。
大概先這樣,其他想到後補。