首先,思考一個問題,看下面三個代碼,當拋出異常時,後面的代碼還會運行嗎,是否要在異常後加上return語句?
//代碼1
public static void test() throws Exception {
throw new Exception("參數越界");
System.out.println("異常後"); //編譯錯誤,「無法訪問的語句」
}
//代碼2
try{
throw new Exception("參數越界");
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("異常後");//可以執行
//代碼3
if(true) {
throw new Exception("參數越界");
}
System.out.println("異常後"); //拋出異常,不會執行
總結:
1.代碼1,編譯無法通過,提示“無法訪問的語句”。
2.代碼2,異常被捕捉,可以被執行。
3.代碼3,可以通過編譯,但是後面的語句不會被執行。
運行時異常與檢查異常的區別:
1.運行時異常是RuntimeException類及其子類,是非檢查性異常,如空指針異常、數組下標越界異常、類型轉換異常、算術異常。運行時異常與檢查性異常最大的區別在於運行時異常不用對其捕獲,JVM會自行處理,會自動catch運行時異常並停止線程,打印異常。如果產生運行時異常,相當於bug了,則需要修改代碼避免異常,當然也可以手動拋出或者捕捉異常。
2.檢查性異常是Exception類本身及其子類中除運行時異常之外的其他異常,檢查性異常必須通過throws進行申明拋出,或者通過try-catch進行捕捉處理,否則不能通過編譯,如IO異常,SQL異常等。