Java中的受檢異常
Java提供了三種異常類型,受檢異常(checked exception)、運行時異常(runtime exception)、錯誤(error)。那么這受檢異常在實際開發中又有什么最佳實踐呢?
受檢異常
如果拋出的異常是可恢復的,同時我們也期望API的調用者捕獲異常進行恢復處理,那么我們應該使用受檢異常。受檢異常會強迫API的使用者截獲異常並恢復處理,或者進行聲明繼續拋出。
圖 1.IDE工具提示需要針對受檢異常進行處理
圖 2.捕獲受檢異常並進行恢復處理
圖 3.重新聲明受檢異常
總而言之,對於可恢復的情況,使用受檢異常;如果不清楚是否可能恢復,則最好使用未受檢異常。
雖然受檢異常是Java語言一項很好的特性,它強迫程序員處理異常,大大增強程序的可靠性。但是過分的使用受檢異常會使API使用非常不方便,調用者必須在catch塊中處理所有的受檢異常,或者調用者必須聲明拋出這些受檢異常。
受檢異常恢復的原子性
對於受檢異常來說,我們期望在執行某個操作失敗的時候,對象仍然保持在一種定義良好的可用狀態之中,這樣我們就可以從異常中進行恢復。一般而言,失敗的方法調用應該使對象保持調用之前的狀態,即受檢異常的原子性。
我們有以下方式可以實現受檢異常的原子性
1.使用不可變對象
如果對象不可變,那么在對象實例化的時候就確定了其狀態,以后再也不能發生改變了,所以方法的執行就不能修改對象的狀態,只能通過新建對象作為返回參數。
2.提前檢查參數的有效性
在執行可變對象的方法之前檢查參數的有效性,是的對象的狀態被修改之前,先拋出適當的異常,這是可變對象獲取受檢異常原子性最常見的方法。
3.編寫攔截操作失敗並回滾對象狀態的恢復代碼。
4.現在臨時拷貝的對象上執行操作,當操作成功后再用臨時拷貝中的結果代替對象的內容。
雖然一般情況下大家都希望實現受檢異常的原子性,但是並非總是可以做到的,例如缺少同步機制,並發修改同一個對象的狀態。即使有時可以輕松實現受檢異常的原子性,但是其可能會險種的增加開銷和復雜性,並不一定是人們所期望的。