在初學程式的時候,一定很討厭例外(Exception)發生,因為程式就沒辦法跑完了,也代表我們可能有地方寫錯,人嘛,一定不喜歡犯錯,總希望事事都平順如己意的完成。
但是當碰到一個完整的系統時,其實就會很感激有例外這樣的機制,因為系統不是寫作業的程式那麼單純,層層堆疊的類別交互作用,例外機制讓我們在設計程式時可以幫我們釐清,當有問題發生時,是發生在什麼位置,我們才可以有效率的解決問題。例外無所不在,人真的不是神,我們能夠設想到的可能性非常有限,絕對需要完善的例外處理,透過不斷測試才有機會讓系統更完美。
所以今天要來談談Java的例外架構。
假設當我們在撰寫IO相關的程式來讀檔時,IDE就會出現FileNotFoundException要我們處理,看是要在方法上throws還是要在方法裡面建try catch block處理。
可是有時候我們自己寫的程式,若有變數為null但卻又叫用了該變數類別的方法時,就會在console跳出NullPointerException,可是IDE就沒有要我們在程式碼中處理NullPointerException。
為什麼有這樣的差異呢?
這些不同類別的Exception,如果是強制要我們在程式碼中處理的叫做受檢例外(Checked Exception);而不需要強制處理的叫做非受檢例外(Unchecked Exception)。
可是當我們查看官方Java API時,好像找不到甚麼check還是uncheck的類別?我該如何知道哪些是受檢例外哪些是非受檢例外勒?
其實就是看那個例外物件是處於例外家族中的哪個位置,簡單來說只要不是RuntimeException這個家系的,就是Checked Exception;反過來說只要是RuntimeException家系的就會是Unchecked Exception。
至於左邊被冷落的Error是甚麼呢?是指當程式發生嚴重的問題時,會被歸類在這個分支,通常是不正常的狀況發生時才會有Error,某部分會是硬體上所發生的問題,而這些問題對於程式設計者來說,也是無法預期的問題,故不會在我們coding時去處理。