第六十條 優先使用標準的異常
通俗來說,高手和菜鳥一個比較明顯的區別,就是關於程式碼的複用,高手可以高度的重用,異常也不例外。java平臺提供了一系列基本的未受檢的異常,滿足了絕大多數API的異常丟擲需求。重用現有異常有很多好處,因為Java提供的異常是公共的,大家都在使用,其他人也熟悉,所以使你的api更容易學習和使用;異常的api大家都熟悉,所以程式碼的可讀性會跟好,大家都熟悉這些異常;異常類越少,記憶體開銷也越小,開銷也越小。
最經常被重用的異常是IllegalArgumentException,非法狀態。如果某個物件,還沒有被正確的初始化,或者正在初始化的時候,呼叫物件的功能,通常就丟擲這個異常。初始化包括但不限於 new 一個物件,或者物件要賦值才能使用等等。比如做android的都知道,比如ImageLoader Picasso Okhttp 等,都需要初始化一些配置,如果沒呼叫init初始化新增引數配置,那就丟擲異了。可以說,所有的錯誤都可以總結為非法引數或者非法狀態,但,我們可以更加細化這些異常。在某些特定情況下的非法引數和非法狀態:如果呼叫者在某個不允許null值的引數中傳遞了null,此時,丟擲 NullPointerException,而不是IllEgalArgumentException; 同理, 如果在表示序列下表的引數,越界了,就丟擲IndexOutOfBoundsException,而不是
IllegalArgumentException。另外一個通用的異常是ConcurrentModificationException,例如,多執行緒操作ArrayList的add()或remove()方法,就會丟擲它,這個異常是物件被設計為單執行緒操作或者外部多執行緒同步機制配合使用,卻多執行緒同時操作的情況丟擲的。最後一個值得重視的異常是UnsupportedOperationException,如果物件不支援這個操作,就丟擲這個異常,比如基類裡一個方法,如果子類必須實現它才能用,通常做法是抽象,另一種思路就是在基類的這個方法丟擲這個異常,強制子類去重寫這個方法;或者另外一個場景,我們自定義了只支援add()方法的List列表,如果有人試圖呼叫remove()方法,我們就丟擲這個異常。
還有一些其他型別的異常,例如
IOException 輸入流和輸出流時可能出現的異常,這個範圍比較廣,屬於總的範疇
EOFException 檔案已結束異常,還強制使用
FileNotFoundException 檔案未找到異常,沒找到這個檔案的路徑
ClassCastException 型別轉換異常類
SQLException 資料庫操作異常
NumberFormatException 字串轉換為數字丟擲的異常
StringIndexOutOfBoundsException 字串索引超出範圍丟擲的異常
NoSuchFieldException 欄位未找到的異常
NoSuchMethodException 方法未找到的異常
InstantiationException 當應用程式試圖使用Class類中的newInstance()方法建立一個類的例項,而指定的類物件無法被例項化時,例如無空構造方法時丟擲該異常
在條件許可的情況下,其他的異常也可以被重用,前提是,一定要保證丟擲的條件與文件中的描述保持一致。我們使用哪個異常並不是互斥的,也不一定總是很精準的,這個可以根據實際情況而定,沒有嚴格的規範要求。