Java中的異常處理(隨堂筆記)

即事隨緣發表於2020-10-08

異常:在Java語法中,將程式執行中發生的不正常情況稱為“異常”(開發過程中的語法錯誤和邏輯錯誤不是異常);

Java程式在執行過程中所發生的異常事件可分為兩類:

  • Error:Java虛擬機器無法破解的嚴重問題。如:JVM系統內部錯誤,資源耗盡等嚴重情況。比如:StackOverflowError。一般不編寫針對性的程式碼進行處理;
  • Exception:其他因程式設計錯誤或偶然的外在因素導致的一般性問題,可以使用針對性的程式碼處理;例如:空指標訪問、試圖讀取不存在的檔案、網路連線中斷、陣列角標越界等;

異常體系結構

java.lang.Throwable

​ ---------java.lang.Error : 一般不編寫針對性的程式碼進行處理;

​ ---------java.lang.Exception:可以進行異常處理;

​ -------------編譯時異常(checked)

​ |----------IOException

​ |-----------FileNotFoundException

​ -------------進行時異常(unchecked)

​ |-----------NullPointerException(空指標異常)

​ |-----------ClassCastException

​ |----------ArrayIndexOutOfBoundsException(角標越界)

​ |----------NumberFormatException(數值轉換異常)

​ |----------InputMismatchException(輸入不匹配)

​ |----------ArithmeticException(算數異常)

異常的處理:抓拋模型

過程一:“拋”:程式在正常執行的過程中,一旦出現異常,就會在異常程式碼處生成一個對應異常類的物件,並將此物件丟擲;一旦丟擲物件以後,其後的程式碼就不再執行;

過程二:“抓”:可以理解為異常的處理方式:(1)try-catch-finally (2)throws

//try-catch-finally的使用
try{
    //可能出現異常的程式碼
}catch(異常型別1 變數名1){
    //處理異常的方式1
}catch(異常型別2 變數名2){
    //處理異常的方式2
}catch(異常型別3 變數名3){
    //處理異常的方式3
}
...
    finally{
        //一定會執行的程式碼
    }

說明:
  1. finally是可選的;
  2. 使用try將可能出現異常程式碼包裝起來,在執行過程中,一旦出現異常,就會生成一個對應異常類的物件,根據此物件的型別,去catch中進行匹配;
  3. 一旦try中的異常物件匹配到某一個catch時,就進入catch中進行異常的處理,一旦處理完成,就跳出當前的try-catch結構(在沒有寫finally的情況),繼續執行其後的程式碼;
  4. catch中的異常型別如果沒有子父類關係,則誰宣告在上,誰宣告在下無所謂;
    catch中的異常型別如果滿足子父類關係,則要求一定宣告在父類的上面,否則報錯;
  5. 常用的異常物件處理的方式:getMessage()、printStackTrace();
  6. 在try結構中宣告的變數,再出了try結構以後,就不能再被呼叫;
  7. try-catch-finally結構是可以相互巢狀的;
try-catch-finally中finally的使用
  1. finally是可選的;

  2. finally中宣告的是一定會被執行的程式碼,即使catch中又出現異常了,try中有return語句,catch中有return語句等情況;

  3. 像資料庫連線、輸入輸出流、網路程式設計Socket等資源,JVM是不能自動的回收的,我們需要自己動手進行資源釋放,此時的資源釋放,就需要宣告在finally中;

體會1.使用try-catch-finally處理編譯時異常,使得程式在編譯時就不會報錯,但是執行時仍可能報錯,相當於我們使用try-catch-finally將一個編譯時可能出現的異常,延遲到執行時出現;

體會2.開發中,由於執行時異常比較常見,所以我們通常就不針對執行時異常編寫try-catch-finally了,針對編譯時異常,我們一定要考慮異常的處理;

異常處理的方式二:throws + 異常型別
  1. “throws + 異常型別”寫在方法的宣告處,指明此方法執行時,可能會丟擲的異常型別;一旦當方法體執行時,出現異常,仍會在異常程式碼處生成一個異常類的物件,此物件滿足throws後異常型別,就會被丟擲,異常程式碼後續的程式碼,就不再執行;

  2. try-catch-finally:真正的將異常給處理掉了;

  3. throws的方式只是將異常拋給了方法的呼叫者,並沒有真正的將異常給處理掉;

  4. 開發中如何選擇使用try-catch-finally,還是throws?

  • 如果父類中被重寫的方法沒有throws方式處理異常,則子類重寫的方法也不能使用throws,意味著如果子類重寫的方法中有異常,必須使用try-catch-finally方式處理;
  • 執行的方法A中,先後又呼叫了另外的幾個方法,這幾個方法時遞進關係執行的,建議這幾個方法使用throws的方式進行處理,而執行的方法A可以考慮使用try-catch-finally方式進行處理;
throw 和 throws 的區別
  • throw 表示丟擲一個異常類的物件,生成異常物件的過程,宣告在方法體內;
  • throws 屬於異常處理的一種方式,宣告在方法的宣告處;

相關文章