/*
- 面試題:
- 1:final,finally和finalize的區(qū)別
- final:最終的意思,可以修飾類,成員變量,成員方法
修飾類,類不能被繼承
修飾變量,變量是常量
修飾方法,方法不能被重寫
- finally:是異常處理的一部分,用于釋放資源。
一般來(lái)說(shuō),代碼肯定會(huì)執(zhí)行,特殊情況:在執(zhí)行到finally之前jvm退出了
- finalize:是Object類的一個(gè)方法,用于垃圾回收
- 2:如果catch里面有return語(yǔ)句,請(qǐng)問finally里面的代碼還會(huì)執(zhí)行嗎?
- 如果會(huì),請(qǐng)問是在return前,還是return后。
面試回答: 會(huì)。前。
準(zhǔn)確的說(shuō),應(yīng)該是在中間。
- 3:try...catch...finally的格式變形
A:try...catch...finally
B:try...catch
C:try...catch...catch...
D:try...catch...catch...finally
E:try...finally
這種做法的目前是為了釋放資源。
*/
public class FinallyDemo2 {
public static void main(String[] args) {
System.out.println(getInt()); //返回30
}
public static int getInt(){
int a=10;
try {
System.out.println(a/0); //分母除0拋出異常
a=20; //不會(huì)執(zhí)行
}catch (ArithmeticException e){
a=30;
//System.exit(0);
return a;// 形成返回路徑return 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;
*/
} finally {
a = 40;
System.out.println("a=" + a);// 會(huì)輸出40,單此時(shí)的a已經(jīng)不會(huì)和上面發(fā)生關(guān)系了
// return a;// 如果這樣結(jié)果就是40了。
}
//其實(shí)在下面的兩句代碼在執(zhí)行的時(shí)候不會(huì)執(zhí)行,如果不寫會(huì)報(bào)錯(cuò),因?yàn)椴灰欢〞?huì)執(zhí)行catch,就沒有了return 語(yǔ)句
System.out.println("a=" + a);
return a;// 返回的是30
}
}