Java 異常規范


1. 只針對異常情況使用異常,不要用異常來控制流程

1 try {
2     int i = 0;
3     while (true) {
4         range[i++].doSomething();
5     }
6 } catch (ArrayIndexOutOfBoundsException e) {
7     // ...
8 }

說明:

1) 上述反例企圖通過捕獲異常來結束無限循環,以此達到遍歷數組的目的。不要這么做!
2) 異常機制本身設計為處理異常情況,用異常來實現正常控制流,會阻止 JVM 本來可能要執行的某些特定優化,從而導致代碼效率變低

 


2. 優先使用標准異常
常見的標准異常: 

NullPointerException

空指針異常。當應用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出null等等

NoClassDefFoundError

未找到類定義錯誤。當Java虛擬機或者類裝載器試圖實例化某個類,而找不到該類的定義時拋出該錯誤

ClassNotFoundException

找不到類異常。當應用試圖根據字符串形式的類名構類,而在遍歷CLASSPAH之后找不到對應名稱的class文件時,拋出該異常

IOException

輸入輸出異常

IllegalArgumentException

非法參數異常。比如參數個數不對應,參數類型不對應

IllegalStateException

違法的狀態異常。當在Java環境和應用尚未處於某個方法的合法調用狀態,而調用了該方法時,拋出該異常

SQLException

操作數據庫異常

ClassCastException

類型強制轉換異常

FileNotFoundException

文件未找到異常

ArrayIndexOutOfBoundsException

數組越界

EOFException

文件已結束異常

ArithmeticExecption

算術異常。比如除0操作

SecturityException

違背安全原則異常

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

說明:

1) 以上異常順序排列與使系統崩潰的頻次相關

2) 使用標准異常可以提高代碼可讀性

 


3. 不要捕獲了異常卻什么也不做

1 try {
2     // ...
3 } catch (Exception e) {
4     // 不要這么做
5 }

說明:

1) 忽略異常就好比把火警報警器關了,當火災發生時,你雖然看不到聽不到了,但不意味着火災不會造成災難性后果。這是典型的掩耳盜鈴

2) 捕獲異常必須處理。如果不想處理,可以把他拋給調用者。最外層調用者必須處理

 


4. 拋出與抽象對應的異常 如果方法拋出的異常與它所執行的任務沒有任何聯系,這種情形會讓人不知所措

異常轉譯:更高層實現應該捕獲低層異常,同時拋出可以按高層抽象進行解釋的異常

1 try {
2     // ...
3 } catch (LowerLevelException e) {
4     throw new HigherLevelException(...);
5 }

 

 

5. 不要對大段代碼進行無腦 try-catch。代碼要區分穩定代碼和可能出現異常的代碼,要保 證捕獲異常的部分是可能出問題的代碼塊最小集

 

6. finally 塊必須對資源對象、流對象進行關閉,有異常也要做 try-catch

說明: 如果 JDK7 及以上,可以使用 try-with-resources 方式

 

7. 不能在 finally 塊中使用 return,finally 塊中的 return 返回后方法結束執行,不 會再 執行 try 塊中的 return 語句

 

8. 對於可恢復的情況,使用受檢的異常;對於程序錯誤,使用運行時異常

Java 異常體系結構

說明:

1) Error 與 Exception Error 是程序無法處理的錯誤,比如 OutOfMemoryError、ThreadDeath 等。這些異常發 生時,Java 虛擬機(JVM)一般會選擇線程終止 Exception 是程序本身可以處理的異常,這種異常分兩大類運行時異常和非運行時異常。
程序中應當盡可能去處理這些異常

2) 運行時異常和非運行時異常(受檢異常) 運行時異常都是 RuntimeException 類及其子類異常,如 NullPointerException、 IndexOutOfBoundsException 等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可 以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異 常的發生。 非運行時異常是 RuntimeException 以外的異常,類型上都屬於 Exception 類及其子類。 從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如 IOException、SQLException 等以及用戶自定義的 Exception 異常,一般情況下不自定義檢查 異常


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM