1. 程式人生 > >Java異常捕獲相關

Java異常捕獲相關

異常的產生

    異常是程式之中導致程式中斷的一種指令流,異常一旦出現並且沒有進行合理處理的話,那麼程式就將中斷執行。 我們要做的是即使程式出現了異常,也要讓程式在可控範圍內正確的執行完畢。

Java異常類繼承結構

繼承結構

       Java所有的異常型別最高的繼承類是Throwable,Throwable下有兩個子類:
1. Error:指的是JVM錯誤,這個時候的程式並沒有執行,無法處理;
2. Exception:指的是程式之中出現的錯誤資訊,可以進行異常處理。通常只對Exception進行處理。

try、catch、finally結構

機構如下:

    try {
             可能出現異常的語句 ;
    } [ catch (異常型別 異常物件) {
             處理異常 ;
    } catch (異常型別 異常物件) {
             處理異常 ;
    } ...
] [finally { 不管是否出現異常,都執行此程式碼 ; }]
  1. 當try內語句產生異常之後,那麼JVM根據異常的型別,例項化一個指定異常類的物件;
  2. 首先異常類物件會與catch一個個匹配,匹配成功則執行相應的catch內語句,接下來執行finally(如果有)中的語句,之後程式繼續往下執行。
  3. 沒有catch將會查詢是否有finally(事實上一般情況下try之後必須跟上catch操作,否則編譯不通過),有則執行finally,之後程式繼續往下執行。
  4. 程式中沒有任何的異常處理操作(沒有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。

引用