常見的異常:
①RuntimeException:Exception :異常層次結構的根類;ArithmeticException:數學計算異常;ArrayIndexOutOfBoundsException:數組越界異常;NullPointerException:空指針異常;NegativeArraySizeException:負數組長度異常;ClassCastException:造型異常;NumberFormatException:數字轉化格式異常;IllgalArgumentException:非法參數值異常;IllegalStateException:對象狀態異常,如對未初始化的對象調用方法;InterruptedException:線程中斷;UnsupportedOperationException:對象不支持的操作異常,如調用方法名、方法參數寫錯等。②IOException:FileNotFoundException:指定文件未找到異常;EOFException:讀寫文件尾異常;MalformedURLException:URL格式錯誤異常;SocketException:Socket通信異常。③其它異常:ClassNotFoundException:無法找到需要的類文件異常。
throws:並沒有真正的處理異常,只是騙過編譯器。
a) 逐層的上拋異常,直到main方法。如果main中仍沒有處理,程序會被異常中斷。
b) throws中斷了本層的代碼。
c) throws運行時異常沒有意義
要想積極的處理異常,用try-catch-finally:
try{// 出現1次
// 可能出現異常的代碼
}catch(異常對象){// 出現0-N次 多次的時候小的寫上面,大的寫下面,異常時從上到下逐步的捕獲的。
// 捕獲到對應異常對象之後所做的處理。
}finally{// 出現0-1次,沒有catch時finally一定要有。
// 一定會執行的代碼
}
對於編譯時異常:
一般都是try-catch-finally處理掉。方法中可以不處理,用throws上拋,最終拋到了main,main方法中禁止用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()代碼塊中來執行。可以通過Exception的getMessage()方法來獲得異常的詳細信息或者通過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 ...");