Java異常捕獲相關
異常的產生
異常是程式之中導致程式中斷的一種指令流,異常一旦出現並且沒有進行合理處理的話,那麼程式就將中斷執行。 我們要做的是即使程式出現了異常,也要讓程式在可控範圍內正確的執行完畢。
Java異常類繼承結構
Java所有的異常型別最高的繼承類是Throwable,Throwable下有兩個子類:
1. Error:指的是JVM錯誤,這個時候的程式並沒有執行,無法處理;
2. Exception:指的是程式之中出現的錯誤資訊,可以進行異常處理。通常只對Exception進行處理。
try、catch、finally結構
機構如下:
try {
可能出現異常的語句 ;
} [ catch (異常型別 異常物件) {
處理異常 ;
} catch (異常型別 異常物件) {
處理異常 ;
} ... ] [finally {
不管是否出現異常,都執行此程式碼 ;
}]
- 當try內語句產生異常之後,那麼JVM根據異常的型別,例項化一個指定異常類的物件;
- 首先異常類物件會與catch一個個匹配,匹配成功則執行相應的catch內語句,接下來執行finally(如果有)中的語句,之後程式繼續往下執行。
- 沒有catch將會查詢是否有finally(事實上一般情況下try之後必須跟上catch操作,否則編譯不通過),有則執行finally,之後程式繼續往下執行。
程式中沒有任何的異常處理操作(沒有try),則這個異常類的例項化物件將交給JVM進行處理,而JVM的預設處理方式就是進行異常資訊的輸出,而後中斷程式執行。
- 對一段程式碼加上try,就等於顯示地承諾編譯器,對這段程式碼可能丟擲的異常進行捕獲而非向上丟擲處理。如果是普通異常,編譯器要求必須用catch捕獲以便進一步處理;如果執行時異常,捕獲然後丟棄並且+finally掃尾處理,或者加上catch捕獲以便進一步處理。
- 當try塊存在多條語句,如果當前語句丟擲異常,接下來的語句將不會執行;
public static void main(String[] args) {
File f = new File("");
try {
f.createNewFile();
System.out .println("123");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("IOException");
// e.printStackTrace();
} finally {
System.out.println("finally");
}
}
執行結果如下:
- 同常呼叫printStackTrace()方法進行異常資訊的列印,這個方法將列印是完整的異常資訊。
異常處理流程:
throws關鍵字
throws關鍵字主要是在方法定義上使用的,表示的是此方法之中不進行異常的處理,而交給被呼叫處處理(向上丟擲)。
public static void main(String[] args) {
try {
createFile();
} catch (IOException e) {
System.out.println("IOException");
// TODO Auto-generated catch block
// e.printStackTrace();
}
}
public static void createFile()throws IOException {
File f = new File("");
f.createNewFile();
}
main方法上throws將繼續向上拋,交給JVM進行異常的處理,也就是採用預設的方式,輸出異常資訊,而後結束程式執行。
throw關鍵字
在方法體內使用,表示人為的丟擲一個異常類物件(這個物件可可以是自己例項化的,也可以是已存在的,通常用自定義異常)。
try {
throw new Exception("我的異常");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
RuntimeException類
Java中規定,對於RuntimeException的異常型別,在編譯的時候不會強制性的要求使用者處理,使用者可以根據需要有選擇性的來進行處理,在開發之中,如果沒有處理,那麼出現異常之後將交給JVM預設進行處理。也就是說,RuntimeException的子異常類,可以由使用者根據需要有選擇性的來進行處理。
常見的RuntimeException子類
RuntimeException:
- NumberFormatException
- ClassCastException
- NullPointerException
- ArithmeticException
- ArrayIndexOutOfBoundsException。