1. 程式人生 > >什麼時候使用Unchecked Exception / Checked Exception?

什麼時候使用Unchecked Exception / Checked Exception?

Java為我們提供了異常,通常是通過throws來申明方法可能會丟擲的異常,用throw來丟擲異常,用try-catch來捕獲異常並處理,但是,我們知道除了強制申明或捕獲的異常(Checked Exception)之外,Java還為我們提供了Unchecked Exception。

強制申明或捕獲Checked Exception是通過編譯器保證的。

對習用過C的人來說,可能覺得Exception是多餘的,或者不習慣使用Exception;對於某些想著快速完成編碼,實現功能的人來說,也不希望被Exception佔用太多的程式碼量。所以有的人會全部使用Unchecked Exception(RuntimeException),對於那些JDK或者其他第三方lib帶的Checked Exception也會直接封裝成Unchecked Exception,這樣程式碼中幾乎在Exception上浪費任何程式碼。

可是,這樣的問題也很明顯。我們首先想到的就是,我們白費了Java的苦心,Java給我們設計Exception的目的就是希望我們可以處理一些異常情況(不正常事件)。

Exception代表著程式遇到了異常情況,從而使得正常流程跳到了不正常流程。catch給我們處理異常的機會。

可是真的所有的異常情況我們都能處理嗎?有些可以,有些可以適當的處理,有些我們完全無能無力。

舉個例子,如果你呼叫一個方法,你只傳了一個int引數,可是,這個方法丟擲了一個NullPointerException,你該怎麼辦?我們什麼也做不了,好吧,最多記個日誌;如果你呼叫一個方法需要寫一個字串到指定的檔案裡,然後丟擲個FileNotFoundException,那我們大概知道我們應該先建立這個檔案;如果一個方法是給使用者下單的,丟擲UserNotFoundException,那麼至少還可以引導使用者註冊,不至於無能為力。

所以,如果站在方法層面來看,如果方法的呼叫方可以通過這個Exception做出某些處理,那麼可以考慮把這個異常定義成Checked Exception,並在方法簽名處宣告,反之,可以定義成Unchecked Exception,不需要宣告

其實我們可以猜測一下Java設計者當初的想法,最穩妥的方式是全部都是Checked Exception,這樣你能處理的異常你就處理,你不能處理的就忽略(或者僅僅只記日誌)。但是,這樣的話,程式碼中會充斥著大量的異常處理程式碼,比如,空指標,陣列越界等等。所以,對於一些我們無能為力的異常,不妨把它定義成Unchecked Exception。