74. throw 和 throws 的區(qū)別魁巩?
throws是用來(lái)聲明一個(gè)方法可能拋出的所有異常信息徒役,throws是將異常聲明但是不處理寞蚌,而是將異常往上傳,誰(shuí)調(diào)用我就交給誰(shuí)處理麸折。而throw則是指拋出的一個(gè)具體的異常類型锡凝。
75. final、finally垢啼、finalize 有什么區(qū)別窜锯?
final可以修飾類、變量膊夹、方法衬浑,修飾類表示該類不能被繼承、修飾方法表示該方法不能被重寫(xiě)放刨、修飾變量表示該變量是一個(gè)常量不能被重新賦值工秩。
finally一般作用在try-catch代碼塊中,在處理異常的時(shí)候进统,通常我們將一定要執(zhí)行的代碼方法finally代碼塊中助币,表示不管是否出現(xiàn)異常,該代碼塊都會(huì)執(zhí)行螟碎,一般用來(lái)存放一些關(guān)閉資源的代碼眉菱。
finalize是一個(gè)方法,屬于Object類的一個(gè)方法掉分,而Object類是所有類的父類俭缓,該方法一般由垃圾回收器來(lái)調(diào)用克伊,當(dāng)我們調(diào)用System的gc()方法的時(shí)候,由垃圾回收器調(diào)用finalize(),回收垃圾华坦。?
76. try-catch-finally 中哪個(gè)部分可以省略愿吹?
答:catch 可以省略
原因:
更為嚴(yán)格的說(shuō)法其實(shí)是:try只適合處理運(yùn)行時(shí)異常,try+catch適合處理運(yùn)行時(shí)異常+普通異常惜姐。也就是說(shuō)犁跪,如果你只用try去處理普通異常卻不加以catch處理,編譯是通不過(guò)的歹袁,因?yàn)榫幾g器硬性規(guī)定坷衍,普通異常如果選擇捕獲,則必須用catch顯示聲明以便進(jìn)一步處理条舔。而運(yùn)行時(shí)異常在編譯時(shí)沒(méi)有如此規(guī)定枫耳,所以catch可以省略,你加上catch編譯器也覺(jué)得無(wú)可厚非逞刷。
理論上嘉涌,編譯器看任何代碼都不順眼妻熊,都覺(jué)得可能有潛在的問(wèn)題夸浅,所以你即使對(duì)所有代碼加上try,代碼在運(yùn)行期時(shí)也只不過(guò)是在正常運(yùn)行的基礎(chǔ)上加一層皮扔役。但是你一旦對(duì)一段代碼加上try帆喇,就等于顯示地承諾編譯器,對(duì)這段代碼可能拋出的異常進(jìn)行捕獲而非向上拋出處理亿胸。如果是普通異常坯钦,編譯器要求必須用catch捕獲以便進(jìn)一步處理;如果運(yùn)行時(shí)異常侈玄,捕獲然后丟棄并且+finally掃尾處理婉刀,或者加上catch捕獲以便進(jìn)一步處理。
至于加上finally序仙,則是在不管有沒(méi)捕獲異常突颊,都要進(jìn)行的“掃尾”處理。
77. try-catch-finally 中潘悼,如果 catch 中 return 了律秃,finally 還會(huì)執(zhí)行嗎?
答:會(huì)執(zhí)行治唤,在 return 前執(zhí)行棒动。
代碼示例1:
代碼示例2:
package com.java_02;
/*?*?java面試題--如果catch里面有return語(yǔ)句,
finally里面的代碼還會(huì)執(zhí)行嗎宾添?
*/
public class FinallyDemo2 {
????public static void main(String[] args) {
????????System.out.println(getInt());
????}
????public static int getInt() {
????????????int a = 10;
????try {
????????System.out.println(a / 0);
????????a = 20;
????????} catch (ArithmeticException e){
????????????????a = 30; return a;
????????/* * return a 在程序執(zhí)行到這一步的時(shí)候船惨,這里不是return a 而是 return 30柜裸;這個(gè)返回路徑就形成了 但是呢,它發(fā)現(xiàn)后面還有finally粱锐,所以繼續(xù)執(zhí)行finally的內(nèi)容粘室,a=40 * 再次回到以前的路徑,繼續(xù)走return 30,形成返回路徑之后卜范,這里的a就不是a變量了衔统,而是常量30 */
????????????} finally {
????????????????a = 40;
????????????????return a;
//如果這樣,就又重新形成了一條返回路徑海雪,由于只能通過(guò)1個(gè)return返回锦爵,所以這里直接返回40
????????}
????????// return a;
????????}
? ?}
78. 常見(jiàn)的異常類有哪些?
NullPointerException:當(dāng)應(yīng)用程序試圖訪問(wèn)空對(duì)象時(shí)奥裸,則拋出該異常险掀。
SQLException:提供關(guān)于數(shù)據(jù)庫(kù)訪問(wèn)錯(cuò)誤或其他錯(cuò)誤信息的異常。
IndexOutOfBoundsException:指示某排序索引(例如對(duì)數(shù)組湾宙、字符串或向量的排序)超出范圍時(shí)拋出樟氢。
NumberFormatException:當(dāng)應(yīng)用程序試圖將字符串轉(zhuǎn)換成一種數(shù)值類型,但該字符串不能轉(zhuǎn)換為適當(dāng)格式時(shí)侠鳄,拋出該異常埠啃。
FileNotFoundException:當(dāng)試圖打開(kāi)指定路徑名表示的文件失敗時(shí),拋出此異常伟恶。
IOException:當(dāng)發(fā)生某種I/O異常時(shí)碴开,拋出此異常。此類是失敗或中斷的I/O操作生成的異常的通用類博秫。
ClassCastException:當(dāng)試圖將對(duì)象強(qiáng)制轉(zhuǎn)換為不是實(shí)例的子類時(shí)潦牛,拋出該異常。
ArrayStoreException:試圖將錯(cuò)誤類型的對(duì)象存儲(chǔ)到一個(gè)對(duì)象數(shù)組時(shí)拋出的異常挡育。
IllegalArgumentException:拋出的異常表明向方法傳遞了一個(gè)不合法或不正確的參數(shù)巴碗。
ArithmeticException:當(dāng)出現(xiàn)異常的運(yùn)算條件時(shí),拋出此異常即寒。例如橡淆,一個(gè)整數(shù)“除以零”時(shí),拋出此類的一個(gè)實(shí)例蒿叠。
NegativeArraySizeException:如果應(yīng)用程序試圖創(chuàng)建大小為負(fù)的數(shù)組明垢,則拋出該異常。
NoSuchMethodException:無(wú)法找到某一特定方法時(shí)市咽,拋出該異常痊银。
SecurityException:由安全管理器拋出的異常,指示存在安全侵犯施绎。
UnsupportedOperationException:當(dāng)不支持請(qǐng)求的操作時(shí)溯革,拋出該異常贞绳。
RuntimeExceptionRuntimeException:是那些可能在Java虛擬機(jī)正常運(yùn)行期間拋出的異常的超類。