摘要:相關(guān)類的結(jié)構(gòu)如下所示類類是語(yǔ)言中所有錯(cuò)誤和異常的超類,只有當(dāng)一個(gè)對(duì)象直接或者間接的是此類的實(shí)例時(shí),才能通過(guò)語(yǔ)句拋出異常,同樣,只有這種類才能被語(yǔ)句捕獲進(jìn)行處理類的子類是錯(cuò)誤,不是程序可以處理的,一般會(huì)是內(nèi)存不足,線程終止,虛擬機(jī)運(yùn)行錯(cuò)誤等,
相關(guān)類的結(jié)構(gòu)如下所示
java.lang.Object
java.lang.Throwable
java.lang.Error
java.lang.Exception
java.lang.RuntimeException
Throwable類Throwable 類是Java語(yǔ)言中所有錯(cuò)誤和異常的超類,只有當(dāng)一個(gè)對(duì)象直接或者間接的是此類的實(shí)例時(shí),Java才能通過(guò)throw語(yǔ)句拋出異常,同樣,只有這種類才能被try……catch語(yǔ)句捕獲進(jìn)行處理
Throwable類的子類Error是錯(cuò)誤,不是程序可以處理的,一般會(huì)是內(nèi)存不足,線程終止,Java虛擬機(jī)運(yùn)行錯(cuò)誤等,只能聽之任之,JVM通常會(huì)kill掉這個(gè)進(jìn)程
Throwable類的子類Exception是異常,是程序可以處理的,進(jìn)一步分為CheckedException 和 UncheckedException
CheckedException發(fā)生在編譯階段,代碼語(yǔ)句必須使用try……catch或者throws,否則無(wú)法進(jìn)行編譯,比如StreamTokenizer必須聲明拋出異常IOException,除了Runtime Exception類集之外,其他的Exception類集都是CheckeException
UncheckedException發(fā)生在程序的運(yùn)行階段,一般來(lái)說(shuō)具有不確定性,不容易定位和DEBUG
Exception類
該類指出了合理的應(yīng)用程序想要捕獲的異常條件,有兩個(gè)參數(shù),默認(rèn)構(gòu)造可以是兩個(gè)可選參數(shù),一個(gè)是詳細(xì)信息,一個(gè)是異常原因,分別對(duì)應(yīng)下述四個(gè)構(gòu)造方法,分別于super對(duì)應(yīng)
public Exception()
public Exception(String message)
public Exception(String message, Throwable cause)
public Exception(Throwable cause)
RuntimeException類RuntimeException是那些在Java 虛擬機(jī)正常運(yùn)行期間拋出的異常的超類,屬于uncheckedException,比如說(shuō)發(fā)生數(shù)組越界,空指針等邏輯引起的問(wèn)題
可能在執(zhí)行方法期間拋出,但是沒(méi)有被捕獲的RuntimeException的任何子類都不用在throws子句中聲明
包含四個(gè)構(gòu)造方法
RuntimeException()
RuntimeException(String message)
RuntimeException(String message, Throwable cause)
RuntimeException(Throwable cause)
try - catch - finally在try代碼片段中,包含著有可能拋出異常的語(yǔ)句,如果無(wú)異常,則直接跳到finally代碼塊,否則相應(yīng)的捕獲異常,執(zhí)行catch代碼塊的內(nèi)容
無(wú)論是否try代碼塊發(fā)生異常,finally都會(huì)被執(zhí)行,可以在這里進(jìn)行一些接口的close操作等
如果代碼中顯式的聲明了某一個(gè)異常類型,則異常處理機(jī)制不會(huì)顯示這個(gè)異常是在哪里拋出的,如果是沒(méi)有聲明異常遭遇中斷,異常處理會(huì)顯示出處
每一個(gè)catch按照書寫的先后依次匹配執(zhí)行,一旦亦常被某一個(gè)catch捕獲,則必不會(huì)被其他的catch捕獲處理
當(dāng)try代碼塊或者catch代碼塊中包括return語(yǔ)句的時(shí)候,finally代碼塊將會(huì)在return之前被強(qiáng)制執(zhí)行,finally不被執(zhí)行僅僅當(dāng)下列條件被滿足:
代碼在finally代碼塊之前即發(fā)生錯(cuò)誤
代碼在finally代碼塊之前進(jìn)行了System.exit()
當(dāng)前線程由于某種情況丟失
關(guān)機(jī),或者各種奇葩的可能條件
throw 和 throwsthrows 是方法拋出異常的聲明,表示一個(gè)預(yù)動(dòng)作,說(shuō)明下方方法可能會(huì)拋出異常,throws不做其他處理,僅僅是上交異常到調(diào)用,方法中拋出的任何異常都必須有throws聲明,除非是將交由運(yùn)行時(shí)系統(tǒng)自動(dòng)拋出的RuntimeException
throw是拋出異常,是一個(gè)明確的動(dòng)作,必須與try……catch或者throws一起使用,拋出的只能是Throwable的類集中的類,如果所有的方法都將異常往上層調(diào)用者拋,那么JVM最后的處理就是打印異常消息和堆棧信息
自定義異常類型一般來(lái)說(shuō),套路如下:
定義一個(gè)類,繼承自Throwable或者某一個(gè)子類
構(gòu)造方法,或者直接使用super的構(gòu)造方法
throws聲明,在代碼塊的某處throw該異常類
catch到拋出的異常進(jìn)行處理
異常鏈機(jī)制當(dāng)異常較少的時(shí)候,我們可以對(duì)每一個(gè)異常進(jìn)行try 和catch, 但是如果出現(xiàn)多個(gè)異常,顯然通過(guò)一個(gè)Exception處理所有異常的方式會(huì)增加維護(hù)代碼DEBUG的困難度,所以我們需要將異常信息進(jìn)行封裝,然后捕獲我們的異常封裝類即可
異常的處理方式有兩種,一種是throws拋出異常后交給上級(jí)去處理,另一種就是使用try和catch進(jìn)行具體的修正處理,異常鏈的處理采用第一種方式,在try ……catch的catch代碼塊中不做任何處理,唯一的動(dòng)作就是拋出封裝好的異常信息,然后會(huì)有throws拋出該異常,遞歸的每一層都如此控制異常拋出,就形成了一條異常鏈
如果我們想要在捕獲到一個(gè)異常后拋出另外一個(gè)異常,那么,我們可以調(diào)用Throwable類集的getCause()方法,得到類中的cause參數(shù),這個(gè)參數(shù)保存的就是原始存有的異常信息,也就是說(shuō)cause是導(dǎo)致拋出該throwable的throwable
保留有異常鏈的catch代碼塊中可以使用Throwable的printStackTrace()方法來(lái)打印整個(gè)異常信息
getCause() 返回由一個(gè)需要Throwable的構(gòu)造方法提供的cause,或者是在創(chuàng)建Throwable之后通過(guò)initCause()來(lái)設(shè)定cause,子類不必要重寫,也不必重寫printStackTrace()
printStackTrace()方法會(huì)將對(duì)象的堆棧跟蹤輸出到輸出流,作為System.err的值
幾個(gè)建議盡量在try中不要包含太多的代碼,縮小異常范圍圈
如果有的接口即使有異常也照樣要運(yùn)行,那么應(yīng)該使用finally
縮小catch捕獲的異常,盡量使catch捕獲明確的單個(gè)異常
拋出異常的時(shí)候,盡量包含易讀易懂的描述和名稱
不在構(gòu)造函數(shù)中拋出異常,不在finally代碼塊中處理返回
不要老拋出異常,會(huì)降低Java的效率和系統(tǒng)的性能
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72367.html
摘要:不過(guò)按照經(jīng)驗(yàn)來(lái)說(shuō),這類異常要么盡量避免,要么出現(xiàn)了就要做異常處理,從而保證程序的健壯性。業(yè)務(wù)是千變?nèi)f化,但是它們可能產(chǎn)生的異常處理方式是不會(huì)變化的,按照這個(gè)思路去做異常處理即可。 前言:說(shuō)到異常體系,可能對(duì)于一些初入職場(chǎng)的老鐵會(huì)很頭痛,不能夠很清晰的描述異常是個(gè)什么情況。那么本文將通過(guò)打流水仗的方式給大家介紹一下工作中涉及的異常知識(shí)。首先能看到本文,說(shuō)明也對(duì)異常是有了解的,所以文章開頭...
摘要:中很多特性或者說(shuō)知識(shí)點(diǎn)都是和面向?qū)ο缶幊谈拍钕嚓P(guān)的。在多線程中內(nèi)容有很多,只是簡(jiǎn)單說(shuō)明一下中初步使用多線程需要掌握的知識(shí)點(diǎn),以后有機(jī)會(huì)單獨(dú)再詳細(xì)介紹一些高級(jí)特性的使用場(chǎng)景。 寫這篇文章的目的是想總結(jié)一下自己這么多年來(lái)使用java的一些心得體會(huì),主要是和一些java基礎(chǔ)知識(shí)點(diǎn)相關(guān)的,所以也希望能分享給剛剛?cè)腴T的Java程序員和打算入Java開發(fā)這個(gè)行當(dāng)?shù)臏?zhǔn)新手們,希望可以給大家一些經(jīng)...
摘要:對(duì)象的自動(dòng)清除對(duì)象回收是由垃圾回收線程負(fù)責(zé)方法可以要求系統(tǒng)進(jìn)行垃圾回收,僅僅是建議系統(tǒng)沒(méi)有析構(gòu)方法,但的有類似方法系統(tǒng)在回收時(shí)會(huì)自動(dòng)調(diào)用對(duì)象的方法子類的方法可以在里面釋放系統(tǒng)資源,一般來(lái)說(shuō),子類的方法中應(yīng)該調(diào)用父類的方法。 對(duì)象的自動(dòng)清除 對(duì)象回收是由垃圾回收線程負(fù)責(zé) System.gc()方法可以要求系統(tǒng)進(jìn)行垃圾回收,僅僅是建議系統(tǒng) java沒(méi)有析構(gòu)方法,但Object的final...
摘要:異常處理機(jī)制異常與異常類的繼承體系在程序中,當(dāng)程序出現(xiàn)意外情況時(shí),系統(tǒng)會(huì)自動(dòng)生成一個(gè)來(lái)通知程序,從異常發(fā)生出逐漸向外傳播,如果沒(méi)有人來(lái)處理該異常,就會(huì)交給來(lái)處理,對(duì)異常的處理方法是,打印異常跟蹤棧信息,并中止程序的執(zhí)行。 1 為什么要處理異常? 異常機(jī)制可以使程序的異常處理代碼與正常業(yè)務(wù)代碼分離,保證程序代碼的健壯性。在設(shè)計(jì)程序的時(shí)候,好的程序需要盡可能處理已知的可能產(chǎn)生的錯(cuò)誤,但是事...
摘要:異常處理作用調(diào)試程序定位缺陷。對(duì)異常的處理是系統(tǒng)容錯(cuò)可靠性的一環(huán)。拋出需要具體子異常捕獲同時(shí)也需要具體子異常不同子異常處理會(huì)不同。如有基礎(chǔ)基類異常調(diào)用者可以選擇使用這個(gè)基類該類下面的所有子異常使用統(tǒng)一處理也可以單獨(dú)對(duì)子異常處理。 showImg(https://segmentfault.com/img/bVbrm5g); 1 背景 1年前的文章,源于Sonar靜態(tài)代碼掃描中,項(xiàng)目歷史代...
閱讀 736·2023-04-25 19:43
閱讀 3981·2021-11-30 14:52
閱讀 3807·2021-11-30 14:52
閱讀 3871·2021-11-29 11:00
閱讀 3802·2021-11-29 11:00
閱讀 3904·2021-11-29 11:00
閱讀 3580·2021-11-29 11:00
閱讀 6184·2021-11-29 11:00