題目:請(qǐng)聊一下,你對(duì)java異常的理解?區(qū)分一下運(yùn)行時(shí)異常和一般異常有何異同?你在平時(shí)工作中遇到的異常類有哪些,詳細(xì)說(shuō)明一下這些異常是怎么產(chǎn)生的?
1 Java異常的理解?
異常主要處理編譯期不能捕獲的錯(cuò)誤。出現(xiàn)問(wèn)題時(shí)能繼續(xù)順利執(zhí)行下去,而不導(dǎo)致程序終止。確保程序的健壯性。
處理過(guò)程:產(chǎn)生異常狀態(tài)時(shí),如果當(dāng)前的context不具備處理當(dāng)前異常的能力,將在heap上new出來(lái)一個(gè)異常對(duì)象,停止當(dāng)前的執(zhí)行路線,把產(chǎn)生的異常對(duì)象拋給更高層的context。
Throwable:異常類;Error :系統(tǒng)異常;不能恢復(fù);Exception :普通異常;可恢復(fù)。
利用try/catch/finally來(lái)處理異常。
在你會(huì)到了上面的東西,有的面試官會(huì)問(wèn)你什么時(shí)候用到finally呢?你應(yīng)該這樣回答,某些事物(除內(nèi)存外)在異常處理完后需要恢復(fù)到原始狀態(tài),如:開啟的文件,網(wǎng)絡(luò)連接等。
2 運(yùn)行時(shí)異常和一般異常有何異同?
異常分為runtime exception和checked exception。
checked exception:java編譯器強(qiáng)制要求catch此類異常,如io異常、sql異常。
runtime exception:不需要強(qiáng)制性處理,一旦出現(xiàn)異常,交由虛擬機(jī)接管。
3 遇到的異常類有哪些?產(chǎn)生的原因?
NullPointerException:空指針。
ArrayIndexOutOfBoundsException:數(shù)組越界。
IllegalArgumentException:參數(shù)非法。
BufferOverflowException:緩存溢出。
ClassNotFoundException:在編譯時(shí)無(wú)法找到指定的類。
ClassCastException:類型強(qiáng)轉(zhuǎn)。
ExceptionInInitializerError:靜態(tài)初始值或靜態(tài)變量初始值期間發(fā)生異常。
UnsatisfiedLinkError:JNI加載dll或者so文件時(shí)未找到。
NoClassDefFoundError:在編譯時(shí)能找到合適的類,而在運(yùn)行時(shí)不能找到合適的類。
上面說(shuō)了這么多常見的異常類,下面咱們?cè)敿?xì)的聊一下OutOfMemoryError(內(nèi)存溢出)這個(gè)異常。
產(chǎn)生的原因:
內(nèi)存中加載的數(shù)據(jù)量過(guò)于龐大,如一次從數(shù)據(jù)庫(kù)取出過(guò)多數(shù)據(jù)。
集合類中有對(duì)對(duì)象的引用,使用完后未清空,使得JVM不能回收。
代碼中存在死循環(huán)或循環(huán)產(chǎn)生過(guò)多重復(fù)的對(duì)象實(shí)體。
使用的第三方軟件中的BUG。
啟動(dòng)參數(shù)內(nèi)存值設(shè)定的過(guò)小。
重點(diǎn)排查以下幾點(diǎn):
1 檢查代碼中是否有死循環(huán)或遞歸調(diào)用。
2 檢查是否有大循環(huán)重復(fù)產(chǎn)生新對(duì)象實(shí)體。
3 檢查對(duì)數(shù)據(jù)庫(kù)查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來(lái)說(shuō),如果一次取十萬(wàn)條記錄到內(nèi)存,就可能引起內(nèi)存溢出。這個(gè)問(wèn)題比較隱蔽,在上線前,數(shù)據(jù)庫(kù)中數(shù)據(jù)較少,不容易出問(wèn)題,上線后,數(shù)據(jù)庫(kù)中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對(duì)于數(shù)據(jù)庫(kù)查詢盡量采用分頁(yè)的方式查詢。
4 檢查L(zhǎng)ist、MAP等集合對(duì)象是否有使用完后,未清除的問(wèn)題。List、MAP等集合對(duì)象會(huì)始終存有對(duì)對(duì)象的引用,使得這些對(duì)象不能被GC回收。
5 檢查對(duì)大文件的讀取是否采用類nio的方式。