資料內(nèi)容:
1. Error 和 Exception 區(qū)別是什么?
Error 類型的錯誤通常為虛擬機(jī)相關(guān)錯誤,如系統(tǒng)崩潰,內(nèi)存不足,堆棧溢出等,編譯器不會對這類錯誤進(jìn)
行檢測,JAVA 應(yīng)用程序也不應(yīng)對這類錯誤進(jìn)行捕獲,一旦這類錯誤發(fā)生,通常應(yīng)用程序會被終止,僅靠應(yīng)用
程序本身無法恢復(fù);
Exception 類的錯誤是可以在應(yīng)用程序中進(jìn)行捕獲并處理的,通常遇到這種錯誤,應(yīng)對其進(jìn)行處理,使應(yīng)用
程序可以繼續(xù)正常運(yùn)行。
2. 運(yùn)行時異常和一般異常(受檢異常)區(qū)別是什
么?
運(yùn)行時異常包括 RuntimeException 類及其子類,表示 JVM 在運(yùn)行期間可能出現(xiàn)的異常。 Java 編譯器不會
檢查運(yùn)行時異常。
受檢異常是Exception 中除 RuntimeException 及其子類之外的異常。 Java 編譯器會檢查受檢異常。
RuntimeException異常和受檢異常之間的區(qū)別:是否強(qiáng)制要求調(diào)用者必須處理此異常,如果強(qiáng)制要求調(diào)用者
必須進(jìn)行處理,那么就使用受檢異常,否則就選擇非受檢異常(RuntimeException)。一般來講,如果沒有特
殊的要求,我們建議使用RuntimeException異常。
3. JVM 是如何處理異常的?
在一個方法中如果發(fā)生異常,這個方法會創(chuàng)建一個異常對象,并轉(zhuǎn)交給 JVM,該異常對象包含異常名稱,異
常描述以及異常發(fā)生時應(yīng)用程序的狀態(tài)。創(chuàng)建異常對象并轉(zhuǎn)交給 JVM 的過程稱為拋出異常。可能有一系列的
方法調(diào)用,最終才進(jìn)入拋出異常的方法,這一系列方法調(diào)用的有序列表叫做調(diào)用棧。
JVM 會順著調(diào)用棧去查找看是否有可以處理異常的代碼,如果有,則調(diào)用異常處理代碼。當(dāng) JVM發(fā)現(xiàn)可以處
理異常的代碼時,會把發(fā)生的異常傳遞給它。如果 JVM 沒有找到可以處理該異常的代碼塊,JVM 就會將該異
常轉(zhuǎn)交給默認(rèn)的異常處理器(默認(rèn)處理器為 JVM 的一部分),默認(rèn)異常處理器打印出異常信息并終止應(yīng)用程
序。
4. throw 和 throws 的區(qū)別是什么?
Java 中的異常處理除了包括捕獲異常和處理異常之外,還包括聲明異常和拋出異常,可以通過throws 關(guān)鍵
字在方法上聲明該方法要拋出的異常,或者在方法內(nèi)部通過 throw 拋出異常對象。
throws 關(guān)鍵字和 throw 關(guān)鍵字在使用上的幾點(diǎn)區(qū)別如下:
throw 關(guān)鍵字用在方法內(nèi)部,只能用于拋出一種異常,用來拋出方法或代碼塊中的異常,受查異常和非受查
異常都可以被拋出。
throws 關(guān)鍵字用在方法聲明上,可以拋出多個異常,用來標(biāo)識該方法可能拋出的異常列表。一個方法用
throws 標(biāo)識了可能拋出的異常列表,調(diào)用該方法的方法中必須包含可處理異常的代碼,否則也要在方法簽名
中用 throws 關(guān)鍵字聲明相應(yīng)的異常。
5. final、finally、finalize 有什么區(qū)別?
final可以修飾類、變量、方法,修飾類表示該類不能被繼承、修飾方法表示該方法不能被重寫、修飾變量表
示該變量是一個常量不能被重新賦值。
finally一般作用在try-catch代碼塊中,在處理異常的時候,通常我們將一定要執(zhí)行的代碼方法finally代碼塊
中,表示不管是否出現(xiàn)異常,該代碼塊都會執(zhí)行,一般用來存放一些關(guān)閉資源的代碼。
finalize是一個方法,屬于Object類的一個方法,而Object類是所有類的父類,Java 中允許使用finalize()方法
在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。
6. NoClassDefFoundError 和
ClassNotFoundException 區(qū)別?
NoClassDefFoundError 是一個 Error 類型的異常,是由 JVM 引起的,不應(yīng)該嘗試捕獲這個異常。引起該異
常的原因是 JVM 或 ClassLoader 嘗試加載某類時在內(nèi)存中找不到該類的定義,該動作發(fā)生在運(yùn)行期間,即編
譯時該類存在,但是在運(yùn)行時卻找不到了,可能是變異后被刪除了等原因?qū)е拢?br />
ClassNotFoundException 是一個受查異常,需要顯式地使用 try-catch 對其進(jìn)行捕獲和處理,或在方法簽名
中用 throws 關(guān)鍵字進(jìn)行聲明。當(dāng)使用 Class.forName, ClassLoader.loadClass 或
ClassLoader.findSystemClass 動態(tài)加載類到內(nèi)存的時候,通過傳入的類路徑參數(shù)沒有找到該類,就會拋出
該異常;另一種拋出該異常的可能原因是某個類已經(jīng)由一個類加載器加載至內(nèi)存中,另一個加載器又嘗試去
加載它。
7. try-catch-finally 中哪個部分可以省略?