基礎(chǔ)搜索來(lái)自網(wǎng)上?https://blog.csdn.net/qq_35069223/article/details/81175117
? Java 對(duì)異常進(jìn)行了分類(lèi),不同類(lèi)型的異常分別用不同的 Java 類(lèi)表示,所有異常的根類(lèi)為 java.lang.Throwable,
Throwable 下面又派生了兩個(gè)子類(lèi):Error 和 Exception,Error 表示應(yīng)用程序本身無(wú)法克服和恢復(fù)的一種嚴(yán)重問(wèn)題。
Exception 表示程序還能夠克服和恢復(fù)的問(wèn)題,其中又分為系統(tǒng)異常和普通異常,系統(tǒng)異常是軟件本身缺陷所導(dǎo)致的
問(wèn)題,也就是軟件開(kāi)發(fā)人員考慮不周所導(dǎo)致的問(wèn)題,軟件使用者無(wú)法克服和恢復(fù)這種問(wèn)題,但在這種問(wèn)題下還可以讓
軟件系統(tǒng)繼續(xù)運(yùn)行或者讓軟件死掉,例如,數(shù)組腳本越界(ArrayIndexOutOfBoundsException),空指針異常
(NullPointerException)、類(lèi)轉(zhuǎn)換異常(ClassCastException);普通異常是運(yùn)行環(huán)境的變化或異常所導(dǎo)致的問(wèn)題,
是用戶(hù)能夠克服的問(wèn)題,例如,網(wǎng)絡(luò)斷線,硬盤(pán)空間不夠,發(fā)生這樣的異常后,程序不應(yīng)該死掉。
? ? ? ?java 為系統(tǒng)異常和普通異常提供了不同的解決方案,編譯器強(qiáng)制普通異常必須 try..catch 處理或用 throws 聲明繼
續(xù)拋給上層調(diào)用方法處理,所以普通異常也稱(chēng)為 checked 異常,而系統(tǒng)異??梢蕴幚硪部梢圆惶幚?,所以,編譯器不
強(qiáng)制用 try..catch 處理或用 throws 聲明,所以系統(tǒng)異常也稱(chēng)為 unchecked 異常
5個(gè)常見(jiàn)RuntimeException
1)java.lang.NullPointerException 空指針異常;出現(xiàn)原因:調(diào)用了未經(jīng)初始化的對(duì)象或者是不存在的對(duì)象。
2)java.lang.ClassNotFoundException 指定的類(lèi)找不到;出現(xiàn)原因:類(lèi)的名稱(chēng)和路徑加載錯(cuò)誤;通常都是程序
試圖通過(guò)字符串來(lái)加載某個(gè)類(lèi)時(shí)可能引發(fā)異常。
3)java.lang.NumberFormatException 字符串轉(zhuǎn)換為數(shù)字異常;出現(xiàn)原因:字符型數(shù)據(jù)中包含非數(shù)字型字符。
4)java.lang.IndexOutOfBoundsException 數(shù)組角標(biāo)越界異常,常見(jiàn)于操作數(shù)組對(duì)象時(shí)發(fā)生。
5)java.lang.IllegalArgumentException 方法傳遞參數(shù)錯(cuò)誤。
6)java.lang.ClassCastException 數(shù)據(jù)類(lèi)型轉(zhuǎn)換異常
==================================================================
具體分析:
1.出現(xiàn)最多應(yīng)該是空指針異常 NullPointerException ,因?yàn)楹芏噙壿嬍沁M(jìn)行if判斷,然而判斷是值跟值的對(duì)比,如果拿空值進(jìn)行對(duì)比,就會(huì)出現(xiàn)空指針異常
2.一般對(duì)于某些可能會(huì)出現(xiàn)異常的地方,都使用try..catch處理,一般不建議使用throws聲明繼續(xù)拋給上層調(diào)用方法處理。因?yàn)楫惓1M量捕獲,這樣才能處理,拋出異常就隱藏了異常,會(huì)給后續(xù)的排查帶來(lái)困難。
3.常見(jiàn)runtimeException,首先這些都是java.lang.xxx
A.NullPointerException 空指針異常
B.ClassNotFoundException 指定的類(lèi)找不到,類(lèi)的名稱(chēng)和路徑加載錯(cuò)誤。也發(fā)生在模塊之間的依賴(lài),底層去使用上層的類(lèi),自然找不到,解決辦法,在盡量有一些必要的就在底層創(chuàng)建一個(gè),然后給上層調(diào)用,通常map是自下而上都可以調(diào)用的,但是map對(duì)于后續(xù)開(kāi)發(fā)沒(méi)太大幫助,因?yàn)閷?duì)應(yīng)的數(shù)據(jù)key-valuer都是隱藏的,你還是需要查看對(duì)應(yīng)代碼,一般都是拿對(duì)象dto進(jìn)行傳遞,這樣可以加上你的注解,別人也知道你傳的值的意義,便于后續(xù)修改
C.NumberFormatException? 字符串轉(zhuǎn)換數(shù)字異常? 原因是字符型數(shù)據(jù)中包含非數(shù)字型字符串,可能出現(xiàn) 身份證解析,正常身份證是15-18位,但是身份證最后一個(gè)可能是X,你拿身份證解析客戶(hù)的出生年月日,不能轉(zhuǎn)成數(shù)字去進(jìn)行處理
D.IndexOutOfBoundsException 數(shù)組角標(biāo)越界異常,常用于操作數(shù)組對(duì)象時(shí)發(fā)生??赡苁窃葦?shù)組是固定長(zhǎng)度,你放進(jìn)去的某個(gè)值長(zhǎng)度超過(guò),然后報(bào)錯(cuò)
E.IllegalArgumentException? 方法傳遞參數(shù)錯(cuò)誤? ?關(guān)于參數(shù)傳遞,很多是long跟Long的選擇,這里建議統(tǒng)一用Long,可以做判空處理
F.ClassCastException? 數(shù)據(jù)類(lèi)型轉(zhuǎn)換異常,這里沒(méi)有太深印象