Java中的異常處理(隨堂筆記)
異常:在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{
//一定會執行的程式碼
}
說明:
- finally是可選的;
- 使用try將可能出現異常程式碼包裝起來,在執行過程中,一旦出現異常,就會生成一個對應異常類的物件,根據此物件的型別,去catch中進行匹配;
- 一旦try中的異常物件匹配到某一個catch時,就進入catch中進行異常的處理,一旦處理完成,就跳出當前的try-catch結構(在沒有寫finally的情況),繼續執行其後的程式碼;
- catch中的異常型別如果沒有子父類關係,則誰宣告在上,誰宣告在下無所謂;
catch中的異常型別如果滿足子父類關係,則要求一定宣告在父類的上面,否則報錯; - 常用的異常物件處理的方式:getMessage()、printStackTrace();
- 在try結構中宣告的變數,再出了try結構以後,就不能再被呼叫;
- try-catch-finally結構是可以相互巢狀的;
try-catch-finally中finally的使用
-
finally是可選的;
-
finally中宣告的是一定會被執行的程式碼,即使catch中又出現異常了,try中有return語句,catch中有return語句等情況;
-
像資料庫連線、輸入輸出流、網路程式設計Socket等資源,JVM是不能自動的回收的,我們需要自己動手進行資源釋放,此時的資源釋放,就需要宣告在finally中;
體會1.使用try-catch-finally處理編譯時異常,使得程式在編譯時就不會報錯,但是執行時仍可能報錯,相當於我們使用try-catch-finally將一個編譯時可能出現的異常,延遲到執行時出現;
體會2.開發中,由於執行時異常比較常見,所以我們通常就不針對執行時異常編寫try-catch-finally了,針對編譯時異常,我們一定要考慮異常的處理;
異常處理的方式二:throws + 異常型別
-
“throws + 異常型別”寫在方法的宣告處,指明此方法執行時,可能會丟擲的異常型別;一旦當方法體執行時,出現異常,仍會在異常程式碼處生成一個異常類的物件,此物件滿足throws後異常型別,就會被丟擲,異常程式碼後續的程式碼,就不再執行;
-
try-catch-finally:真正的將異常給處理掉了;
-
throws的方式只是將異常拋給了方法的呼叫者,並沒有真正的將異常給處理掉;
-
開發中如何選擇使用try-catch-finally,還是throws?
- 如果父類中被重寫的方法沒有throws方式處理異常,則子類重寫的方法也不能使用throws,意味著如果子類重寫的方法中有異常,必須使用try-catch-finally方式處理;
- 執行的方法A中,先後又呼叫了另外的幾個方法,這幾個方法時遞進關係執行的,建議這幾個方法使用throws的方式進行處理,而執行的方法A可以考慮使用try-catch-finally方式進行處理;
throw 和 throws 的區別
- throw 表示丟擲一個異常類的物件,生成異常物件的過程,宣告在方法體內;
- throws 屬於異常處理的一種方式,宣告在方法的宣告處;
相關文章
- java異常處理筆記Java筆記
- Java 中的異常處理機制Java
- JAVA 異常處理Java
- Java 異常處理Java
- JAVA異常處理Java
- Java中的異常處理最佳實踐Java
- swoft 學習筆記之異常處理筆記
- 筆記:異常處理之report與render筆記
- java優雅的處理程式中的異常Java
- JAVA_異常處理Java
- Java 異常表與異常處理原理Java
- 隨堂筆記筆記
- Java 異常處理中的種種細節!Java
- Java中處理SocketException: Connection reset”異常的方法JavaException
- Java 筆記《異常》Java筆記
- SpringMVC學習筆記10-異常處理SpringMVC筆記
- Java 的異常處理機制Java
- java異常的處理機制Java
- 翻譯 | Java流中如何處理異常Java
- Java中如何處理空指標異常Java指標
- Java異常處理(非常全面)Java
- Java異常處理機制Java
- 重學Java - 異常處理Java
- SpringBoot中異常處理Spring Boot
- java常用修飾符(隨堂筆記)Java筆記
- Django筆記三十一之全域性異常處理Django筆記
- Ruby中的TypeError異常處理Error
- 異常的處理
- 異常-throws的方式處理異常
- 異常篇——異常處理
- Java之異常處理try{}catch(){}Java
- Java進階02 異常處理Java
- JAVA學習之異常處理Java
- Java 異常處理:使用和思考Java
- 記錄Laravel異常處理類Laravel
- Java程式異常處理的特殊情況Java
- spring中的統一異常處理Spring
- springboot專案中的異常處理Spring Boot