Java異常處理總結
一、Java 異常繼承框架
Error:
Error類對象由 Java 虛擬機生成並拋出,大多數錯誤與代碼編寫者所執行的操作無關。對於設計合理的應用程序來說,即使確實發生了錯誤,本質上也不應該試圖去處理它所引起的異常狀況。
Exception:
在Exception分支中有一個重要的子類RuntimeException(運行時異常),這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生;而RuntimeException之外的異常我們統稱為非運行時異常,類型上屬於Exception類及其子類,從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。
註意
Error和Exception的區別:Error通常是災難性的致命的錯誤,是程序無法控制和處理的,當出現這些異常時,Java虛擬機(JVM)一般會選擇終止線程;Exception通常情況下是可以被程序處理的,並且在程序中應該盡可能的去處理這些異常。
?提示
除了RuntimeException及其子類以外,其他的Exception類及其子類都屬於檢查異常,當程序中可能出現這類異常,要麽使用try-catch語句進行捕獲,要麽用throws子句拋出,否則編譯無法通過。
?提示 對於運行時異常、錯誤和檢查異常,Java技術所要求的異常處理方式有所不同。 由於運行時異常及其子類的不可查性,為了更合理、更容易地實現應用程序,Java規定,運行時異常將由Java運行時系統自動拋出,允許應用程序忽略運行時異常。 對於方法運行中可能出現的Error,當運行方法不欲捕捉時,Java允許該方法不做任何拋出聲明。因為,大多數Error異常屬於永遠不能被允許發生的狀況,也屬於合理的應用程序不該捕捉的異常。 對於所有的檢查異常,Java規定:一個方法必須捕捉,或者聲明拋出方法之外。也就是說,當一個方法選擇不捕捉檢查異常時,它必須聲明將拋出異常。
二、異常處理原則
異常處理語法
try{
//code that might generate exceptions
}catch(Exception e){
//the code of handling exception1
}catch(Exception e){
//the code of handling exception2
} finally {
}
一個例子:
public class Ex1 { public static void main(String[] args) { try{ System.out.println(Ex1.getResult()); }catch(Exception e){ e.printStackTrace(); System.out.println("截獲異常catch"); }finally{ System.out.println("異常處理finally"); } } public static int getResult() throws Exception{ int a =100; try{ a=a+10; throw new RuntimeException(); }catch(Exception e){ System.out.println("截獲異常並重新拋出異常"); throw new Exception(); }finally{ return a; } } }
輸出如下:
截獲異常並重新拋出異常
110
異常處理finally
“截獲異常catch”卻沒有執行!
原因是在getResult()的finally中return一個值,等同於告訴編譯器該方法沒有異常,但實際上異常是有的,這樣的結果是該方法的調用者卻捕獲不到異常,不要再finally中試圖return一個值,這樣可能會導致一些意想不到的邏輯錯誤,finally就是用來釋放資源的!
註意:在finally中改變返回值的做法是不好的,因為如果存在finally代碼塊,try中的return語句不會立馬返回調用者,而是記錄下返回值待finally代碼塊執行完畢之後再向調用者返回其值,然後如果在finally中修改了返回值,就會返回修改後的值。顯然,在finally中返回或者修改返回值會對程序造成很大的困擾,C#中直接用編譯錯誤的方式來阻止程序員幹這種齷齪的事情,Java中也可以通過提升編譯器的語法檢查級別來產生警告或錯誤,Eclipse中可以在如圖所示的地方進行設置,強烈建議將此項設置為編譯錯誤。
三、總結
Java的異常處理的知識點雜而且理解起來也有點困難,這裏給大家總結了以下幾點使用java異常處理的時候,良好的編碼習慣:
1、處理運行時異常時,采用邏輯去合理規避同時輔助try-catch處理
2、在多重catch塊後面,可以加一個catch(Exception)來處理可能會被遺漏的異常
3、對於不確定的代碼,也可以加上try-catch,處理潛在的異常
4、盡量去處理異常,切記只是簡單的調用printStackTrace()去打印
5、具體如何處理異常,要根據不同的業務需求和異常類型去決定
6、盡量添加finally語句塊去釋放占用的資源
Java異常處理總結