異常

常見的異常:

    RuntimeExceptionException :異常層次結構的根類;ArithmeticException:數學計算異常;ArrayIndexOutOfBoundsException:數組越界異常;NullPointerException:空指針異常;NegativeArraySizeException:負數組長度異常;ClassCastException:造型異常;NumberFormatException:數字轉化格式異常;IllgalArgumentException:非法參數值異常;IllegalStateException:對象狀態異常,如對未初始化的對象調用方法;InterruptedException:線程中斷;UnsupportedOperationException:對象不支持的操作異常,如調用方法名、方法參數寫錯等。IOExceptionFileNotFoundException:指定文件未找到異常;EOFException:讀寫文件尾異常;MalformedURLExceptionURL格式錯誤異常;SocketExceptionSocket通信異常。其它異常:ClassNotFoundException:無法找到需要的類文件異常。


throws:並沒有真正的處理異常,只是騙過編譯器。

a) 逐層的上拋異常,直到main方法。如果main中仍沒有處理,程序會被異常中斷。

b) throws中斷了本層的代碼。

c) throws運行時異常沒有意義

要想積極的處理異常,用try-catch-finally:

try{// 出現1

// 可能出現異常的代碼

}catch(異常對象){// 出現0-N次 多次的時候小的寫上面,大的寫下面,異常時從上到下逐步的捕獲的。

// 捕獲到對應異常對象之後所做的處理。

}finally{// 出現0-1次,沒有catchfinally一定要有。

// 一定會執行的代碼

}


對於編譯時異常:

一般都是try-catch-finally處理掉。方法中可以不處理,用throws上拋,最終拋到了mainmain方法中禁止用throws上拋異常。意味着main一定要處理。

對於運行時異常:可以用try-catch-finally處理,但是對效率和代碼閱讀都有影響,所有一般都是用if條件來使程序健壯。


try-catch-finally的工作原理:

   要監控的程序語句包含在try塊中,catch中存放以合理的方式捕獲和處理異常的語句,finally中主要是釋放資源等。

通過try-catch語句,可以將可能出現的異常通過catch()子句捕獲並在相應的地方處理,另外還可以加入一個finally子句,在finally子句中的代碼段無論是否發生異常都將被無條件執行。

異常處理可以定義在方法體、自由塊或構造方法中。並且,try-catch-finally語句可以嵌套使用。

將可能出現異常的代碼都放在try代碼塊中,當然,也可以將其它的一些不會引起異常的代碼也一併放到try代碼塊中。

catch() 從句中引入一個可能出現的異常,一個try塊可以和多個catch()塊配合以處理多個異常。

try塊內的任何代碼拋出了由catch() 子句指定的異常,則try代碼段中的程序將會終止執行,並跳到相應的catch()代碼塊中來執行。可以通過ExceptiongetMessage()方法來獲得異常的詳細信息或者通過printStackTrace()方法來跟蹤異常事件發生時執行堆棧的內容。

無論是否出現異常,程序最後都會執行finally代碼塊中的內容。finally的意義在於,無論程序如何運行,它都必然會被執行到。如果在try從句中給方法分配了一些資源(比如,數據庫連接、打開一個文件、網絡連接等),然後,方法出現異常,它將會拋出一個異常,方法中的未執行的代碼將會中止執行,並轉而執行catch()從句中的內容。這個時候,本來定義在try從句中的資源回收動作就不會執行了,這就會導致資源沒有回收的情況。此時,就可以將資源回收的動作放到finally從句中來執行,無論是否會有異常發生,它都能被執行到。

  多個catch語句時,小異常寫上面,大異常寫下面:

int a = 2;
int b = 0;
String str = null;
try{// 可能會出現異常的代碼
    a = a/b;
    str.equals("");
    // 多個catch語句時,小異常寫上面,大異常寫下面
}catch(ArithmeticException ae){// 捕獲try中拋出的異常。當try中拋出異常被捕獲到時執行這裏
    ae.printStackTrace();// 打印異常對象的堆棧信息
}catch(NullPointerException ne){
    ne.printStackTrace();
}catch(RuntimeException re){
    re.printStackTrace();
}catch(Exception e){
    e.printStackTrace();
}
System.out.println("main end");

finally的用法:

int a = 2;
        int b = 0;
        try{
            System.out.println("try");
            a = a/b;// 新建文件夾
        }catch(NullPointerException e){
            System.out.println("算術運算異常");// 刪除文件夾
            System.out.println("catch");
        }finally{// 最終的。一定會執行
            // 刪除臨時文件,關閉資源文件
            System.out.println("finally");
        }
        System.out.println("else code ...");


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章