1、首先來看一下JAVA異常繼承關(guān)系:
關(guān)于Error和Exception的區(qū)別:
Error:
An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch.
錯(cuò)誤是Throwable的子類奖磁,它表示合理的應(yīng)用程序無法捕獲的嚴(yán)重問題充易。
Exception:
The class Exception and its subclasses are a form of Throwable that indicates conditions that a reasonable application might want to catch.
Exception類及其子類是Throwable的一種形式,它指示合理的應(yīng)用程序可以捕獲處理撵儿。
關(guān)于checked Exception和unchecked Exception區(qū)別:
check exception:程序編譯期就要求要被處理的 否則編譯無法通過 其定義范圍為該異常是Exception的子類但不是RuntimeException的子類 則該異常為check exception
uncheckedException:該異常是RuntimeException或者是其子類
關(guān)于 error和unchecked exception的不同
這兩種異常的發(fā)生時(shí)機(jī)都是runtime運(yùn)行時(shí) 但是error是不建議去處理的 也就是使用try-catch 因?yàn)榧幢慵恿?大部分情況也處理不了 而runtimeException是可處理的
以下內(nèi)容復(fù)制自https://blog.csdn.net/weixin_43681425/article/details/84147396#1.1
?以便后續(xù)查詢
2、異常處理:
有一些方法在聲明的時(shí)候就聲明扔出一個(gè)exception儡陨。如果這個(gè)exception是checked exception司致,則調(diào)用這個(gè)方法的時(shí)候就必須handle它煞躬。
checked exception就像一個(gè)炸彈肛鹏,如果說方法A的某處扔出一個(gè)炸彈,或者從別處接到一個(gè)炸彈(調(diào)用了另一個(gè)扔出exception的方法)恩沛, 有兩種解決方案:
自己把它拆了( try-catch-finally)在扰。 這樣的話調(diào)用方法A的方法不用擔(dān)心這個(gè)炸彈(異常)了
繼續(xù)丟出去, 誰調(diào)用方法A誰來處理(在A的method declaration的時(shí)候加上throws.)
如果采用第一種方案雷客,當(dāng)方法B調(diào)用方法A的時(shí)候芒珠,方法A已經(jīng)把炸彈拆了,方法B不用擔(dān)心任何事情搅裙。
如果采用第二種方法皱卓,方法B調(diào)用方法A的時(shí)候知道同時(shí)要接到一個(gè)炸彈,于是它有兩種解決方案呈宇,拆了好爬,或者繼續(xù)throws局雄。
2.1 如何拆炸彈 用try-catch-finally
try-catch:
一個(gè)常見的數(shù)組越界exception甥啄。是個(gè)unchecked的exception,因?yàn)榫幾g時(shí)沒有要求handle炬搭,所以是個(gè)常見的新手 runtime異常蜈漓。(不要求被handle,但是如果想handle也是可以的宫盔。)
一個(gè)try可以跟著好幾個(gè)catch, 為了分開處理不同的錯(cuò)誤:
一個(gè)exception發(fā)生之后融虽,如果是Exception1類型的,就會被第一個(gè)handle灼芭,如果不是Exception1類型的就會接著往下找catch有额,如果是Exception2類型的,就會被第二個(gè)catch塊handle彼绷。
如果Exception1和Exception2是父子關(guān)系巍佑,則兒子要先被檢測,因?yàn)槿绻职窒缺粰z測寄悯,就永遠(yuǎn)也到不了兒子那個(gè)catch塊了萤衰。
finally block:
finally block 是無論如何也會發(fā)生的一個(gè)block。 catch里的代碼如果不發(fā)生異常就不會被執(zhí)行猜旬,但是finally里面的代碼無論如何都會執(zhí)行脆栋。(除非是在try或者catch里面用System.exit(1)結(jié)束jvm倦卖。)通常用來關(guān)閉文件。
另外椿争, try-finally也是合法的怕膛。
2.2 如何繼續(xù)甩鍋 throws exception
用throws關(guān)鍵詞
來看個(gè)綜合的例子:
下面代碼由于接到了exception沒有正確handle而產(chǎn)生編譯錯(cuò)誤:
因?yàn)镕ileReader的constructor throws了一個(gè)異常
所以當(dāng)getFile方法調(diào)用FileReader的時(shí)候必須handle這個(gè)異常。
下面是一個(gè)例子用上面兩種方法處理異常:
運(yùn)行結(jié)果:
一般來講秦踪,所有的exception到了main方法這里都應(yīng)該已經(jīng)被解決了嘉竟。如果,main方法也不負(fù)責(zé)任的往外扔洋侨。舍扰。。
這樣做是可以的希坚。边苹。。在沒有文件的情況下(觸發(fā)exception)運(yùn)行結(jié)果:
3裁僧、SpringBoot異常處理實(shí)例
3.1 定義一個(gè)全局異常處理類GlobalException 通過@ControllerAdvice和@ExceptionHandler(value = “異常類型”)
3.2定義一個(gè)異常類
3.3通過自定義的類動(dòng)態(tài)獲取狀態(tài)碼
3.4 也可以將狀態(tài)碼定義在配置文件中 獲取辦法為通過定義一個(gè)配置類動(dòng)態(tài)獲取