Java異常分類處理拋出捕獲操作詳解
什么是異常
“程序運(yùn)行時(shí),發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常。”
我們?cè)谄綍r(shí)寫代碼的過程中就可能會(huì)遇到異常,給大家給舉一些容易遇到常見的異常例子:
1.算術(shù)異常
Exception in thread “main” java.lang.ArithmeticException: / by zero
在JAVA中,我們都知道0不能作為除數(shù),只能作為被除數(shù),如果把0作為除數(shù),編譯器就會(huì)提示我們出先算術(shù)異常了。
2.數(shù)組越界異常
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 5
數(shù)組越界,我們應(yīng)該也不陌生,在使用數(shù)組時(shí),如果超過了數(shù)組的大小,就會(huì)形成越界。程序就會(huì)發(fā)生異常,從而終止運(yùn)行。
3.空指針異常
Exception in thread “main” java.lang.NullPointerException
對(duì)于數(shù)組arr,讓它賦值為null,我并沒有讓它指向任何對(duì)象,它就是一個(gè)空指針。對(duì)于空指針進(jìn)行訪問,編譯器就會(huì)提示我們空指針異常。
異常的分類
在代碼運(yùn)行時(shí),可能會(huì)出現(xiàn)異常種類有很多,為了對(duì)不同異?;蛘咤e(cuò)誤進(jìn)行很好的分類管理,Java內(nèi)部維護(hù)了一個(gè)異常的體系結(jié)構(gòu):
圖畫的不是很好,大家湊合著看吧。下面為大家講解一下這張圖:
1.Throwable類是Java語言中所有錯(cuò)誤(errors)和異常(exceptions)的父類。
2.Error:指的是Java虛擬機(jī)無法解決的嚴(yán)重問題,比如:JVM的內(nèi)部錯(cuò)誤、資源耗盡等。
3.Exception:異常產(chǎn)生后程序員可以通過代碼進(jìn)行處理,使程序繼續(xù)執(zhí)行。
異常可能在編譯時(shí)發(fā)生,也可能在程序運(yùn)行時(shí)發(fā)生,根據(jù)發(fā)生的時(shí)機(jī)不同,可以將異常分為運(yùn)行時(shí)異常和編譯時(shí)異常。
編譯時(shí)異常
編譯時(shí)異常,也稱為受檢查異常。從名字我們就能夠理解,就是程序在編譯的時(shí)候發(fā)生的異常。
運(yùn)行時(shí)異常
在程序執(zhí)行期間發(fā)生的異常,稱為運(yùn)行時(shí)異常,也稱為非受檢查異常。
編譯時(shí)出現(xiàn)的語法性錯(cuò)誤,不能稱之為異常。編譯過程中就會(huì)出錯(cuò), 這是 “編譯期” 出錯(cuò)。而運(yùn)行時(shí)指的是程序已經(jīng)編譯通過得到class 文件了,再由 JVM 執(zhí)行過程中出現(xiàn)的錯(cuò)誤.
在Java中,異常處理主要的5個(gè)關(guān)鍵字:throw、try、catch、finally、throws
在講異常處理之前,我們先要了解一下異常處理中的關(guān)鍵字,接下來我會(huì)一一為大家介紹這些關(guān)鍵字。
異常的拋出(throw關(guān)鍵字)
在Java中,可以借助throw關(guān)鍵字,拋出一個(gè)指定的異常對(duì)象,將錯(cuò)誤信息告知給調(diào)用者
使用方法:throw new XXXException(“異常產(chǎn)生的原因”);
例如:
public static void main(String[] args) { throw new RuntimeException(); }
雖然代碼沒錯(cuò),但是我是使用throw拋出的一個(gè)異常,所以程序就會(huì)反饋給我一個(gè)異常。
給大家總結(jié)一下throw在使用過程中要注意的一些地方:
- throw必須寫在方法體內(nèi)部
- 拋出的對(duì)象必須是Exception 或者 Exception 的子類對(duì)象
- 如果拋出的是 RunTimeException 或者 RunTimeException 的子類,則可以不用處理,直接交給JVM來處理
- 如果拋出的是編譯時(shí)異常,用戶必須處理,否則無法通過編譯
- 異常一旦拋出,其后的代碼就不會(huì)執(zhí)行
異常的捕獲
異常的捕獲,就是異常的具體處理方式,主要有兩種:異常聲明throws 和try-catch捕獲然后進(jìn)行處理。
throws關(guān)鍵字
throws一般位于方法聲明時(shí)參數(shù)列表之后。
使用方法:修飾符 返回值 方法名(形參)throws 異常類型(可以有多個(gè)異常類型)
聲明的異常必須是 Exception 或者 Exception 的子類
如果有多個(gè)異常,有用逗號(hào)隔開,如果拋出的異常具有父子類關(guān)系,可以直接throws父類
但是不建議直接用throws父類,范圍太大了。throws對(duì)異常并沒有真正處理,而是將異常報(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里面的代碼不一定會(huì)發(fā)生異常。
2.如果代碼發(fā)生了異常,且被catch捕獲到了,就會(huì)進(jìn)行對(duì)應(yīng)的處理,處理完成后就會(huì)跳出try-catch執(zhí)行后面的語句。
3.如果代碼發(fā)生了異常,但不是寫catch語句預(yù)期捕捉的異常的話,那么這個(gè)異常不會(huì)捕捉到,后面的代碼就不會(huì)被執(zhí)行。
4.try-catch可以捕捉多個(gè)異常,但不是同時(shí)捕獲。如果有多個(gè)異常,只能逐個(gè)捕獲。
5.如果有多個(gè)異常,并且有父子類關(guān)系,可以直接寫Exception,因?yàn)樗撬挟惓5母割悾且膊唤ㄗh這么寫,因?yàn)镋xception的范圍太廣了,因?yàn)槊總€(gè)異常處理的方法不一樣。
6.如果使用Exception,那么在寫catch的時(shí)候,要么只寫一個(gè)catch語句,里面放Exception,后面就不能繼續(xù)寫catch語句了,因?yàn)閷懥艘矝]什么用,而且出現(xiàn)的異常都會(huì)被Exception進(jìn)行捕獲。要么就把Exception放在最后寫,前面寫你想捕獲的異常,在最后再使用Exception。
7.try里面拋出異常位置之后的代碼將不會(huì)被執(zhí)行
finally關(guān)鍵字
finally的使用很簡(jiǎn)單,使用方式如下:
public static void main(String[] args) { try{ //代碼 }catch (RuntimeException e){ //()里面寫你想捕捉的異常 //處理異常的代碼 }catch (Exception e){ //同上 } finally{ //代碼 } }
finally的作用:finally后面的代碼一定會(huì)執(zhí)行
前面講了try-catch用來捕獲并處理異常,但是有時(shí)發(fā)生的異常并沒有被捕捉到,那么程序也會(huì)發(fā)生異常終止,但用戶在使用的時(shí)候發(fā)生異常并終止程序,我們也需要對(duì)此進(jìn)行進(jìn)行一定的處理,就可以使用finally關(guān)鍵字,無論有沒有發(fā)生異常,finally內(nèi)的代碼也一定會(huì)執(zhí)行。
總結(jié)
異常處理的流程
- 程序先執(zhí)行 try 中的代碼
- 如果 try 中的代碼出現(xiàn)異常, 就會(huì)結(jié)束 try 中的代碼, 看和 catch 中的異常類型是否匹配.
- 如果找到匹配的異常類型, 就會(huì)執(zhí)行 catch 中的代碼
- 如果沒有找到匹配的異常類型, 異常得不到處理,就會(huì)交給JVM處理,程序就會(huì)異常終止.
- 無論是否找到匹配的異常類型, finally 中的代碼都會(huì)被執(zhí)行到(在該方法結(jié)束之前執(zhí)行).
除此之外,大家也要熟練掌握異常的種類和throw、try、catch、finally、throws這幾個(gè)關(guān)鍵字的用法。
到此這篇關(guān)于Java異常分類處理拋出捕獲操作詳解的文章就介紹到這了,更多相關(guān)Java異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
FeignMultipartSupportConfig上傳圖片配置方式
這篇文章主要介紹了FeignMultipartSupportConfig上傳圖片配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03MyBatis使用注解開發(fā)實(shí)現(xiàn)過程詳解
這篇文章主要介紹了MyBatis使用注解開發(fā)實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Mybatis-Plus將字段設(shè)置為null解決方法
MyBatis-Plus是一個(gè)MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增 強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus將字段設(shè)置為null的解決方法的相關(guān)資料,需要的朋友可以參考下2023-04-04Springboot+MyBatist實(shí)現(xiàn)前后臺(tái)交互登陸功能方式
這篇文章主要介紹了Springboot+MyBatist實(shí)現(xiàn)前后臺(tái)交互登陸功能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01解讀System.getProperty("ENM_HOME")中的值從哪獲取的
這篇文章主要介紹了解讀System.getProperty("ENM_HOME")中的值從哪獲取的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12