IOException是Exception的直接子類別,所以編譯器要求你明確使用語法加以處理。Exception或其子物件,但非屬於RuntimeException或其子物件,稱為受檢例外,其存在之目的,在於API設計者實作某方法時,某些條件成立時會引發錯誤,而且認為呼叫方法的客戶端有能力處理錯誤,要求編譯器提醒客戶端必須明確處理錯誤,不然不可通過編譯,API客戶端無權選擇要不要處理。
屬於RuntimeException衍生出來的類別實例,代表API設計者實作某方法時,某些條件成立時會引發錯誤,而且認為API客戶端應該在呼叫方法前做好檢查,以避免引發錯誤,之所以命名為執行時期例外,是因為編譯器不會強迫一定得在語法上加以處理,亦稱為非受檢例外。
因此即使實際上還是有可能引發例外,但編譯器並不強迫你得處理例外,你有權利選擇是否使用try、catch處理,Java對於RuntimeException的態度是,這是一種臭蟲,也就是呼叫方法前沒有做好前置檢查,應該予以修正,使得呼叫方法時不會引發錯誤,如果真要以try、catch處理,建議是日誌或呈現友善訊息,像是使用try、catch的Average2的作法就是個例子。
雖然有些小題大作,不過使用try、catch的Average3若要避免出現InputMismatchException,應該是取得使用者的字串輸入之後,檢查是否為數字格式,若是再轉換為int整數,若否則提醒使用者做正確格式輸入。