【106期】面試官:Java中的finally一定會(huì)被執(zhí)行嗎?
閱讀本文大概需要 4 分鐘。
來(lái)自:juejin.im/post/5ec2993fe51d45209d437387
一、前言
二、finally一定會(huì)執(zhí)行嗎?
1.在執(zhí)行try塊之前直接return,我們發(fā)現(xiàn)finally塊是不會(huì)執(zhí)行的
public?class?TryCatchTest?{
??private?static?int?total()?{
????int?i =?11;
????if?(i ==?11) {
??????return?i;
????}
????try?{
??????System.out.println("執(zhí)行try");
????}?finally?{
??????System.out.println("執(zhí)行finally");
????}
????return?0;
??}
??public?static?void?main(String[] args)?{
????System.out.println("執(zhí)行main:"?+ total());
??}
}
輸出結(jié)果:
執(zhí)行main:11
復(fù)制代碼
2.在執(zhí)行try塊之前制造一個(gè)錯(cuò)誤,直接爆紅
public?class?TryCatchTest?{
??private?static?int?total()?{
????return?1?/?0;
????try?{
??????System.out.println("執(zhí)行try");
????}?finally?{
??????System.out.println("執(zhí)行finally");
????}
????return?0;
??}
??public?static?void?main(String[] args)?{
????System.out.println("執(zhí)行main:"?+ total());
??}
}
public?class?TryCatchTest?{
??private?static?int?total()?{
????try?{
??????System.out.println("執(zhí)行try");
??????System.exit(0);
????}?catch?(Exception e) {
??????System.out.println("執(zhí)行catch");
????}?finally?{
??????System.out.println("執(zhí)行finally");
????}
????return?0;
??}
??public?static?void?main(String[] args)?{
????System.out.println("執(zhí)行main:"?+ total());
??}
}
輸出結(jié)果:
執(zhí)行try
三、finally執(zhí)行時(shí)機(jī)探討
public?class?TryCatchTest?{
??private?static?int?total()?{
????try?{
??????System.out.println("執(zhí)行try");
??????return?11;
????}?finally?{
??????System.out.println("執(zhí)行finally");
????}
??}
??public?static?void?main(String[] args)?{
????System.out.println("執(zhí)行main:"?+ total());
??}
}
輸出結(jié)果:
執(zhí)行try
執(zhí)行finally
執(zhí)行main:11
public?class?TryCatchTest?{
??private?static?int?total()?{
????try?{
??????System.out.println("執(zhí)行try");
??????return?1?/?0;
????}?catch?(Exception e) {
??????System.out.println("執(zhí)行catch");
??????return?11;
????}?finally?{
??????System.out.println("執(zhí)行finally");
????}
??}
??public?static?void?main(String[] args)?{
????System.out.println("執(zhí)行main:"?+ total());
??}
}
輸出結(jié)果:
執(zhí)行try
執(zhí)行catch
執(zhí)行finally
執(zhí)行main:11
四、finally塊中的返回值
1.finally塊不含返回值,但是做改變變量值的操作
public?class?TryCatchTest?{
??private?static?int?total()?{
????int?i =?0;
????try?{
??????System.out.println("執(zhí)行try:"?+ i);
??????return?i;
????}?finally?{
??????++i;
??????System.out.println("執(zhí)行finally:"?+ i);
????}
??}
??public?static?void?main(String[] args)?{
????System.out.println("執(zhí)行main:"?+ total());
??}
}
輸出結(jié)果:
執(zhí)行try:0
執(zhí)行finally:1
執(zhí)行main:0
++i使得i等于1,在執(zhí)行return i;?自然會(huì)返回1。2.finally中含有返回值
public?class?TryCatchTest?{
??private?static?int?total()?{
????try?{
??????System.out.println("執(zhí)行try");
??????return?1;
????}?finally?{
??????System.out.println("執(zhí)行finally");
??????return?2;
????}
??}
??public?static?void?main(String[] args)?{
????System.out.println("執(zhí)行main:"?+ total());
??}
}
輸出結(jié)果:
執(zhí)行try
執(zhí)行finally
執(zhí)行main:2
public?class?TryCatchTest?{
??private?static?int?total()?{
????int?i =?1;
????try?{
??????System.out.println("執(zhí)行try:"?+ i);
??????return?i;
????}?finally?{
??????++i;
??????System.out.println("執(zhí)行finally:"?+ i);
??????return?i;
????}
??}
??public?static?void?main(String[] args)?{
????System.out.println("執(zhí)行main:"?+ total());
??}
}
輸出結(jié)果:
執(zhí)行try:1
執(zhí)行finally:2
執(zhí)行main:2
public?class?TryCatchTest?{
??private?static?int?total()?{
????int?i =?1;
????try?{
??????System.out.println("執(zhí)行try:"?+ i);
????}?finally?{
??????++i;
??????System.out.println("執(zhí)行finally:"?+ i);
????}
????return?i;
??}
??public?static?void?main(String[] args)?{
????System.out.println("執(zhí)行main:"?+ total());
??}
}
執(zhí)行結(jié)果:
執(zhí)行try:1
執(zhí)行finally:2
執(zhí)行main:2
微信掃描二維碼,關(guān)注我的公眾號(hào)
朕已閱?
評(píng)論
圖片
表情

