Java異常分類處理拋出捕獲操作詳解
什么是異常
“程序運(yùn)行時,發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常。”
我們在平時寫代碼的過程中就可能會遇到異常,給大家給舉一些容易遇到常見的異常例子:
1.算術(shù)異常

Exception in thread “main” java.lang.ArithmeticException: / by zero
在JAVA中,我們都知道0不能作為除數(shù),只能作為被除數(shù),如果把0作為除數(shù),編譯器就會提示我們出先算術(shù)異常了。
2.數(shù)組越界異常

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 5
數(shù)組越界,我們應(yīng)該也不陌生,在使用數(shù)組時,如果超過了數(shù)組的大小,就會形成越界。程序就會發(fā)生異常,從而終止運(yùn)行。
3.空指針異常

Exception in thread “main” java.lang.NullPointerException
對于數(shù)組arr,讓它賦值為null,我并沒有讓它指向任何對象,它就是一個空指針。對于空指針進(jìn)行訪問,編譯器就會提示我們空指針異常。
異常的分類
在代碼運(yùn)行時,可能會出現(xiàn)異常種類有很多,為了對不同異?;蛘咤e誤進(jìn)行很好的分類管理,Java內(nèi)部維護(hù)了一個異常的體系結(jié)構(gòu):

圖畫的不是很好,大家湊合著看吧。下面為大家講解一下這張圖:
1.Throwable類是Java語言中所有錯誤(errors)和異常(exceptions)的父類。
2.Error:指的是Java虛擬機(jī)無法解決的嚴(yán)重問題,比如:JVM的內(nèi)部錯誤、資源耗盡等。
3.Exception:異常產(chǎn)生后程序員可以通過代碼進(jìn)行處理,使程序繼續(xù)執(zhí)行。
異??赡茉诰幾g時發(fā)生,也可能在程序運(yùn)行時發(fā)生,根據(jù)發(fā)生的時機(jī)不同,可以將異常分為運(yùn)行時異常和編譯時異常。
編譯時異常
編譯時異常,也稱為受檢查異常。從名字我們就能夠理解,就是程序在編譯的時候發(fā)生的異常。
運(yùn)行時異常
在程序執(zhí)行期間發(fā)生的異常,稱為運(yùn)行時異常,也稱為非受檢查異常。
編譯時出現(xiàn)的語法性錯誤,不能稱之為異常。編譯過程中就會出錯, 這是 “編譯期” 出錯。而運(yùn)行時指的是程序已經(jīng)編譯通過得到class 文件了,再由 JVM 執(zhí)行過程中出現(xiàn)的錯誤.
在Java中,異常處理主要的5個關(guān)鍵字:throw、try、catch、finally、throws
在講異常處理之前,我們先要了解一下異常處理中的關(guān)鍵字,接下來我會一一為大家介紹這些關(guān)鍵字。
異常的拋出(throw關(guān)鍵字)
在Java中,可以借助throw關(guān)鍵字,拋出一個指定的異常對象,將錯誤信息告知給調(diào)用者
使用方法:throw new XXXException(“異常產(chǎn)生的原因”);
例如:
public static void main(String[] args) {
throw new RuntimeException();
}

雖然代碼沒錯,但是我是使用throw拋出的一個異常,所以程序就會反饋給我一個異常。
給大家總結(jié)一下throw在使用過程中要注意的一些地方:
- throw必須寫在方法體內(nèi)部
- 拋出的對象必須是Exception 或者 Exception 的子類對象
- 如果拋出的是 RunTimeException 或者 RunTimeException 的子類,則可以不用處理,直接交給JVM來處理
- 如果拋出的是編譯時異常,用戶必須處理,否則無法通過編譯
- 異常一旦拋出,其后的代碼就不會執(zhí)行
異常的捕獲
異常的捕獲,就是異常的具體處理方式,主要有兩種:異常聲明throws 和try-catch捕獲然后進(jìn)行處理。
throws關(guān)鍵字
throws一般位于方法聲明時參數(shù)列表之后。
使用方法:修飾符 返回值 方法名(形參)throws 異常類型(可以有多個異常類型)
聲明的異常必須是 Exception 或者 Exception 的子類
如果有多個異常,有用逗號隔開,如果拋出的異常具有父子類關(guān)系,可以直接throws父類
但是不建議直接用throws父類,范圍太大了。throws對異常并沒有真正處理,而是將異常報(bào)告給拋出異常方法的調(diào)用者,由調(diào)用者處理。如果要處理異常就要使用try-catch進(jìn)行處理。
try catch關(guān)鍵字
使用方式如下所示:
public static void main(String[] args) {
try{
//代碼
}catch (){//()里面寫你想捕捉的異常
//處理異常的代碼
}catch (){
//同上
}
}
1.try里面的代碼不一定會發(fā)生異常。
2.如果代碼發(fā)生了異常,且被catch捕獲到了,就會進(jìn)行對應(yīng)的處理,處理完成后就會跳出try-catch執(zhí)行后面的語句。
3.如果代碼發(fā)生了異常,但不是寫catch語句預(yù)期捕捉的異常的話,那么這個異常不會捕捉到,后面的代碼就不會被執(zhí)行。
4.try-catch可以捕捉多個異常,但不是同時捕獲。如果有多個異常,只能逐個捕獲。
5.如果有多個異常,并且有父子類關(guān)系,可以直接寫Exception,因?yàn)樗撬挟惓5母割?,但是也不建議這么寫,因?yàn)镋xception的范圍太廣了,因?yàn)槊總€異常處理的方法不一樣。
6.如果使用Exception,那么在寫catch的時候,要么只寫一個catch語句,里面放Exception,后面就不能繼續(xù)寫catch語句了,因?yàn)閷懥艘矝]什么用,而且出現(xiàn)的異常都會被Exception進(jìn)行捕獲。要么就把Exception放在最后寫,前面寫你想捕獲的異常,在最后再使用Exception。
7.try里面拋出異常位置之后的代碼將不會被執(zhí)行
finally關(guān)鍵字
finally的使用很簡單,使用方式如下:
public static void main(String[] args) {
try{
//代碼
}catch (RuntimeException e){
//()里面寫你想捕捉的異常
//處理異常的代碼
}catch (Exception e){
//同上
} finally{
//代碼
}
}
finally的作用:finally后面的代碼一定會執(zhí)行
前面講了try-catch用來捕獲并處理異常,但是有時發(fā)生的異常并沒有被捕捉到,那么程序也會發(fā)生異常終止,但用戶在使用的時候發(fā)生異常并終止程序,我們也需要對此進(jìn)行進(jìn)行一定的處理,就可以使用finally關(guān)鍵字,無論有沒有發(fā)生異常,finally內(nèi)的代碼也一定會執(zhí)行。
總結(jié)
異常處理的流程
- 程序先執(zhí)行 try 中的代碼
- 如果 try 中的代碼出現(xiàn)異常, 就會結(jié)束 try 中的代碼, 看和 catch 中的異常類型是否匹配.
- 如果找到匹配的異常類型, 就會執(zhí)行 catch 中的代碼
- 如果沒有找到匹配的異常類型, 異常得不到處理,就會交給JVM處理,程序就會異常終止.
- 無論是否找到匹配的異常類型, finally 中的代碼都會被執(zhí)行到(在該方法結(jié)束之前執(zhí)行).
除此之外,大家也要熟練掌握異常的種類和throw、try、catch、finally、throws這幾個關(guān)鍵字的用法。
到此這篇關(guān)于Java異常分類處理拋出捕獲操作詳解的文章就介紹到這了,更多相關(guān)Java異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
FeignMultipartSupportConfig上傳圖片配置方式
這篇文章主要介紹了FeignMultipartSupportConfig上傳圖片配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
MyBatis使用注解開發(fā)實(shí)現(xiàn)過程詳解
這篇文章主要介紹了MyBatis使用注解開發(fā)實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
Mybatis-Plus將字段設(shè)置為null解決方法
MyBatis-Plus是一個MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增 強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus將字段設(shè)置為null的解決方法的相關(guān)資料,需要的朋友可以參考下2023-04-04
Springboot+MyBatist實(shí)現(xiàn)前后臺交互登陸功能方式
這篇文章主要介紹了Springboot+MyBatist實(shí)現(xiàn)前后臺交互登陸功能方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
解讀System.getProperty("ENM_HOME")中的值從哪獲取的
這篇文章主要介紹了解讀System.getProperty("ENM_HOME")中的值從哪獲取的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12

