1. 程式人生 > >Java異常處理總結

Java異常處理總結

tst error 有一個 ror 而是 阻止 cep 行處理 編碼

一、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異常處理總結