Error 和 Exception 區(qū)別是什么?
Error 類型的錯(cuò)誤通常為虛擬機(jī)相關(guān)錯(cuò)誤,如系統(tǒng)崩潰,內(nèi)存不足,堆棧溢出等,編譯器不會(huì)對(duì)這類錯(cuò)誤進(jìn)行檢測(cè),JAVA 應(yīng)用程序也不應(yīng)對(duì)這類錯(cuò)誤進(jìn)行捕獲,一旦這類錯(cuò)誤發(fā)生,通常應(yīng)用程序會(huì)被終止,僅靠應(yīng)用程序本身無(wú)法恢復(fù)。
Exception 類的錯(cuò)誤是可以在應(yīng)用程序中進(jìn)行捕獲并處理的,通常遇到這種錯(cuò)誤,應(yīng)對(duì)其進(jìn)行處理,使應(yīng)用程序可以繼續(xù)正常運(yùn)行。
運(yùn)行時(shí)異常和一般異常(受檢異常)區(qū)別是什么?
運(yùn)行時(shí)異常包括 RuntimeException 類及其子類,表示 JVM 在運(yùn)行期間可能出現(xiàn)的異常。 Java 編譯器不會(huì)檢查運(yùn)行時(shí)異常。
受檢異常是Exception 中除 RuntimeException 及其子類之外的異常。 Java 編譯器會(huì)檢查受檢異常。
RuntimeException異常和受檢異常之間的區(qū)別:是否強(qiáng)制要求調(diào)用者必須處理此異常,如果強(qiáng)制要求調(diào)用者必須進(jìn)行處理,那么就使用受檢異常,否則就選擇非受檢異常(RuntimeException)。一般來(lái)講,如果沒(méi)有特殊的要求,我們建議使用RuntimeException異常。
JVM 是如何處理異常的?
在一個(gè)方法中如果發(fā)生異常,這個(gè)方法會(huì)創(chuàng)建一個(gè)異常對(duì)象,并轉(zhuǎn)交給 JVM,該異常對(duì)象包含異常名稱,異常描述以及異常發(fā)生時(shí)應(yīng)用程序的狀態(tài)。創(chuàng)建異常對(duì)象并轉(zhuǎn)交給 JVM 的過(guò)程稱為拋出異常??赡苡幸幌盗械姆椒ㄕ{(diào)用,最終才進(jìn)入拋出異常的方法,這一系列方法調(diào)用的有序列表叫做調(diào)用棧。
JVM 會(huì)順著調(diào)用棧去查找看是否有可以處理異常的代碼,如果有,則調(diào)用異常處理代碼。當(dāng) JVM 發(fā)現(xiàn)可以處理異常的代碼時(shí),會(huì)把發(fā)生的異常傳遞給它。如果 JVM 沒(méi)有找到可以處理該異常的代碼塊,JVM 就會(huì)將該異常轉(zhuǎn)交給默認(rèn)的異常處理器(默認(rèn)處理器為 JVM 的一部分),默認(rèn)異常處理器打印出異常信息并終止應(yīng)用程序。
NoClassDefFoundError 和 ClassNotFoundException 區(qū)別?
NoClassDefFoundError 是一個(gè) Error 類型的異常,是由 JVM 引起的,不應(yīng)該嘗試捕獲這個(gè)異常。
引起該異常的原因是 JVM 或 ClassLoader 嘗試加載某類時(shí)在內(nèi)存中找不到該類的定義,該動(dòng)作發(fā)生在運(yùn)行期間,即編譯時(shí)該類存在,但是在運(yùn)行時(shí)卻找不到了,可能是變異后被刪除了等原因?qū)е?
ClassNotFoundException 是一個(gè)受查異常,需要顯式地使用 try-catch 對(duì)其進(jìn)行捕獲和處理,或在方法簽名中用 throws 關(guān)鍵字進(jìn)行聲明。當(dāng)使用 Class.forName, ClassLoader.loadClass 或 ClassLoader.findSystemClass 動(dòng)態(tài)加載類到內(nèi)存的時(shí)候,通過(guò)傳入的類路徑參數(shù)沒(méi)有找到該類,就會(huì)拋出該異常;另一種拋出該異常的可能原因是某個(gè)類已經(jīng)由一個(gè)類加載器加載至內(nèi)存中,另一個(gè)加載器又嘗試去加載它。
更多關(guān)于“java培訓(xùn)”的問(wèn)題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學(xué),課程大綱緊跟企業(yè)需求,更科學(xué)更嚴(yán)謹(jǐn),每年培養(yǎng)泛IT人才近2萬(wàn)人。不論你是零基礎(chǔ)還是想提升,都可以找到適合的班型,千鋒教育隨時(shí)歡迎你來(lái)試聽(tīng)。