JavaSE異常Exception處理方法以及自定義
異常是什么
異常就是程序在進(jìn)行時(shí)的不正常行為,就像之前數(shù)組時(shí)會(huì)遇到空指針異常(NullPointerException),數(shù)組越界異常(ArrayIndexOutOfBoundsException)等等。
在java中異常由類來(lái)表示。
異常的分類
異常有一個(gè)頂層類Throwable;
Throwable派生出兩個(gè)子類Error,Exception;
Error指的是Java虛擬機(jī)無(wú)法解決的嚴(yán)重問(wèn)題,例如遞歸時(shí)一直開(kāi)辟棧,導(dǎo)致棧溢出的錯(cuò)誤。
Exception也分為兩種異常:編譯時(shí)異常和運(yùn)行時(shí)異常。
編譯時(shí)異常,這種異常顧名思義是在編譯時(shí)候就會(huì)發(fā)生,這種異常要在程序中捕獲聲明才能讓程序通過(guò)。
例如在比較器文章這篇中要實(shí)現(xiàn)clone方法時(shí)要通過(guò)throws關(guān)鍵字聲明CloneNotSupportedException異常才能正常使用。
運(yùn)行時(shí)異常,這種異常全在(RunTimeException)這個(gè)類和其子類之下,編譯通過(guò),運(yùn)行報(bào)錯(cuò),這種異??梢越唤oJVM處理。
異常的處理方法
異常的處理一般使用throw、try、catch、?nally、throws這五個(gè)關(guān)鍵字。
throw拋出異常
在程序執(zhí)行時(shí),該語(yǔ)句引發(fā)異常,此時(shí)就可以通過(guò)throw拋出異常來(lái)告訴程序員原因。
一般格式為throw new 異常類名("異常產(chǎn)生的原因"); 例如我們進(jìn)行方法傳參為數(shù)組時(shí)參數(shù)是null拋出空指針異常:
public void printArray(int[] array){ if(null == array){ throw new NullPointException("數(shù)組傳參為空null"); }else{ // } }
注意事項(xiàng):1.異常的拋出必須是在方法的內(nèi)部
2.一旦異常拋出成功之后,在該語(yǔ)句之后的代碼就不會(huì)執(zhí)行了。就像上面寫(xiě)的else里面的語(yǔ)句不會(huì)執(zhí)行了。
3.拋出的異常必須是Exception的或其子類,編譯時(shí)異常必須在后續(xù)代碼中處理,運(yùn)行時(shí)異??梢越唤oJVM處理。
異常的聲明
異常的聲明就是告訴這個(gè)方法會(huì)報(bào)哪些異常,然后在這個(gè)方法內(nèi)部不用對(duì)異常處理,讓后面使用這個(gè)方法時(shí)對(duì)異常進(jìn)行處理。
一般格式:
修飾符 返回值類型 方法名(參數(shù)表列) throws 異常類型1,異常類型2...{ }
注意事項(xiàng):1.格式不能變,一定是將聲明放在參數(shù)表列后面,可以多個(gè)異常同時(shí)聲明
2.聲明的異常必須是Exception的或其子類。如果聲明的異常是具有父子類關(guān)系,只聲明父類也可以
異常的捕獲和處理
使用try-catch語(yǔ)句來(lái)對(duì)異常進(jìn)行捕獲和處理。
使用格式:
try{ //會(huì)產(chǎn)生異常的代碼 }catch(異常類型1 e){ //對(duì)異常的處理代碼 }catch(異常類型2 e){ //對(duì)異常的處理代碼 }
注意事項(xiàng):
1.像前面一樣如果try中拋出異常后還有代碼就不會(huì)執(zhí)行,
2.catch語(yǔ)句之間就像if-else語(yǔ)句一樣,只會(huì)執(zhí)行其中一個(gè)異常,
3.如果try中拋出異常被catch捕獲并處理了那就會(huì)執(zhí)行try-catch之后的語(yǔ)句,如果沒(méi)有捕獲到就不會(huì)執(zhí)行
4.如果兩個(gè)異常是父子類,一定要把子類異常catch放在前面
5.如果兩個(gè)異常處理方式一樣也可以用單豎杠 | 來(lái)處理catch(異常類型1 | 異常類型2 e){}但是這樣就不知道具體是哪個(gè)異常了。
finally
這個(gè)語(yǔ)句是跟try-catch語(yǔ)句一起用的,這個(gè)語(yǔ)句的特點(diǎn)就是比catch先執(zhí)行,里面常放一些資源關(guān)閉代碼
格式:
try{ //會(huì)產(chǎn)生異常的代碼 }catch(異常類型1 e){ //對(duì)異常的處理代碼 }catch(異常類型2 e){ //對(duì)異常的處理代碼 }finally{ //資源關(guān)閉代碼 }
try 或者 catch 中如果有 return 會(huì)在這個(gè) return 之前執(zhí)行 ?nally. 但是如果
?nally 中也存在 return 語(yǔ)句, 那么就會(huì)執(zhí)行 ?nally 中的 return, 從而不會(huì)執(zhí)行到 try 中原有的 return.
自定義異常類
異常本質(zhì)就是一個(gè)類,然后繼承于已有的異常類。在寫(xiě)自己的異常類時(shí)類名最后一個(gè)單詞使用Exception更加規(guī)范
格式:
class NameException extends 異常類{ // }
自定義異常類時(shí)一般繼承Exception 或 RunTimeException。
繼承Exception默認(rèn)是編譯時(shí)異常,
繼承RunTimeException是運(yùn)行時(shí)異常,
在自定義異常類中一般會(huì)實(shí)現(xiàn)如下的一個(gè)構(gòu)造方法,來(lái)報(bào)出什么原因?qū)е庐惓#?/p>
public NameException(String message) { super(message); }
總結(jié)
到此這篇關(guān)于JavaSE異常Exception處理方法以及自定義的文章就介紹到這了,更多相關(guān)JavaSE異常Exception內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java消息隊(duì)列RabbitMQ入門(mén)詳解
這篇文章主要介紹了Java消息隊(duì)列RabbitMQ入門(mén)詳解,RabbitMQ是使用Erlang語(yǔ)言開(kāi)發(fā)的開(kāi)源消息隊(duì)列系統(tǒng),基于AMQP協(xié)議 來(lái)實(shí)現(xiàn),AMQP的主要特征是面向消息、隊(duì)列、路由(包括點(diǎn)對(duì)點(diǎn)和發(fā)布 /訂閱)、可靠性、安全,需要的朋友可以參考下2023-07-07超細(xì)講解Java調(diào)用python文件的幾種方式
有時(shí)候我們?cè)趯?xiě)java的時(shí)候需要調(diào)用python文件,下面這篇文章主要給大家介紹了關(guān)于Java調(diào)用python文件的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(49)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08SpringBoot應(yīng)用War包形式部署到外部Tomcat的方法
這篇文章主要介紹了SpringBoot應(yīng)用War包形式部署到外部Tomcat的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08java排序高級(jí)之選擇排序?qū)崿F(xiàn)方法
這篇文章主要介紹了java排序高級(jí)之選擇排序?qū)崿F(xiàn)方法,較為全面的分析了選擇排序的原理與具體實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02