1 異常是爲了在異常情況下使用而設計的。不要將它們用於普通的控制流。
2 Java提供了三種可拋出結構:受檢異常、運行時異常和錯誤。其中後兩者稱爲未受檢異常。
使用原則:
(1)如果期望調用者能夠適當恢復,對於這種情況就應該使用受檢的異常。對於這樣的異常,提供一些輔助方法尤爲重要,通過這些方法,調用者可以收穫一些有助於恢復的信息。例如,用於欠費,企圖呼叫,這是可以拋出受檢異常,提供用於查詢所欠費用的方法,從而將這個數字傳遞給客戶。
(2)對於未受檢異常,這種異常往往表明這屬於不可恢復的情形,再執行下去有害無益。如果程序沒有捕捉這種可拋出結構,將會導致當前線程停止,並出現適當的錯誤信息。
(3)用運行時異常表明程序錯誤。大多數的運行時異常都表示前提違例。所謂前提違例是指API的客戶沒有遵循API規範建立的約定。如數組越界。
3 努力使失敗保持原子性
途徑:
(1)設計一個不可變的對象
(2)對於可變對象,獲得失敗原子性最常見的方法是,在執行操作之前檢查參數的有效性。這可以使得對象的狀態被修改之前,先拋出適當的異常。例如:
public Object pop(){
if(size==0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size]=null;
return result;
}
如果取消對size的檢查,當這個方法企圖彈出一個空棧時將拋出異常。然而,這將會導致size域保持在不一致的狀態之中(負數)。
作爲方法規範的一部分,產生的任何異常都應該讓對象保持在該方法調用之前的狀態。如果違反這條規定,API文檔應該清楚地指明對象將會處於什麼樣的狀態。
4 最常見的可重用異常
異常 | 使用場合 |
---|---|
IllegalArgumentException | 非null的參數值不正確 |
IllegalStateException | 對於方法調用而言,對象狀態不合適 |
NullPointerException | 在禁止使用null的情況下參數值爲null |
IndexOutOfBoundsException | 下標參數值越界 |
ConcurrentModificationException | 在禁止併發修改的情況下,檢測到對象的併發修改 |
UnsupportedOperationException | 對象不支持用戶請求的方法 |
常見的運行時異常
常見的非運行時異常