Java之異常處理try{}catch(){}

鄭清發表於2018-08-25

 

try {
     可能出現異常的程式碼(包括不會出現異常的程式碼)
} catch (Exception e) {          //()裡為接收try{}程式碼塊中出現異常的型別
     如果出現異常時的處理方式
}

try-catch的執行順序:

①從 try{ } 程式碼塊中第一行開始執行,執行到出現異常的程式碼,jvm會建立一個異常物件
②判斷catch中宣告的異常型別是否能捕捉到jvm建立的異常物件
       i:  能捕捉到:直接跳到catch程式碼塊中執行。  不會結束程式,繼續從catch程式碼塊後面的程式碼執行
      ii:  不能捕捉到:直接列印異常資訊並結束程式
③try{} 中沒有出現任何異常,把try中的所有程式碼執行完,跳過catch繼續程式


注意:

1.能被catch捕捉到的條件 ==》try中建立的異常物件的型別與catch中宣告的型別一致,或者是catch中宣告的型別的子類。

2.如果只有一個捕捉指定型別的catch 只能捕捉對應型別的異常物件。  如果try中建立了其他型別的異常,捕捉不到。Jvm來處理異常

3.try{}程式碼塊中存在多行程式碼會丟擲異常的情況下,遇到第一個異常,後面程式碼的異常 只會被catch捕捉到異常資訊但都將不會被執行

4.那麼我們如何才能處理try{}中的每一個異常呢??

  ① 寫多個catch : 每一個catch處理一種異常        ==>    try{ }catch(){ }catch(){ }catch(){ }
       效果:當try中出現了異常,直接跳到第一個catch處判斷,是否能捕捉。
            a:能捕捉:直接處理。  然後跳過trycatch往後執行
            b:不能捕捉:跳到下一個catch繼續判斷。如果下一個能捕捉,重複第一步的效果
            c:所有catch都不能捕捉 ==> 交給jvm處理:結束程式,在控制檯列印異常資訊
  ② 寫一個catch  要求:catch中的異常型別必須是try中丟擲的所有異常的父類
        
    注意事項:寫多個catch時,下邊的catch宣告的異常型別不能是上邊的catch宣告的子類。
                      多個catch時,異常父類必須在下邊。   (沒有繼承關係時,就不用考慮此情況)

try{  }catch(){  }catch(){  }...finally{  }                   (catch可以有多個,也可以沒有 ==》 try{ }finally{ })

特點:寫在finally程式碼塊中程式碼,一定會被執行到
注意:①執行了 return    也會執行finally
           ②但 執行 System.exit(0)   就不會再執行finally了!!!


ex1: (此時 Integer in = new Integer("1");  不會出現異常的情況下)


ex2: (此時 Integer in = new Integer("A1");  出現異常的情況下)


ex3:  多個catch


ex4 :1個catch


ex5: return不影響finally{ }程式碼塊中程式碼的執行


ex6 :    執行 System.exit(0)   ==》 便不會再執行finally{ }程式碼塊中程式碼

 

相關文章