一、finally語句塊是否一定執行?
Java中異常捕獲機制try...catch...finally塊中的finally語句是不是一定會被執行?很多人都說不是,當然他們的回答是正確的,經過試驗,至少以下有兩種情況下finally語句是不會被執行的:
(1)異常捕獲機制finally塊與try和catch塊是關聯的,既然是關聯的如果try...catch...finally語句邏輯上達不到沒有被執行,如在try語句之前就返回了,這樣finally語句就不會執行,這也說明了finally語句被執行的必要而非充分條件是:相應的try...catch...finally語句一定被執行到。
(2)在try塊中有System.exit(0);這樣的語句,System.exit(0);是終止Java虛擬機JVM的,連JVM都停止了,所以都結束了,當然finally語句也不會被執行到。
二、finally語句塊是否一定會執行,遇到return怎么辦?
public class FinallyTest1 {public void test(){try{System.out.println("Try statement block……");return ;}catch(Exception e){System.out.println("Exception statement block……");}finally{System.out.println("在try語句塊中return你再強大,也影響不了我finally語句塊的繼續執行,嘿嘿……");}}public static void main(String[] args) {FinallyTest1 t=new FinallyTest1();t.test();}
}/*運行結果:Try statement block……在try語句塊中return你再強大,也影響不了我finally語句塊的繼續執行,嘿嘿……總結:finally語句塊的執行不會受到try語句塊中的return的影響。
*/
三、finally語句塊不受return語句的影響,哪finally語句塊到底是在return之前還是之后執行?
public class FinallyTest2 {private int test(){ int a=520;try{return a+=1314000;}catch(Exception e){System.out.println();}finally{System.out.println("Finally執行,a值為:"+a);a=0;System.out.println("小鬧了一下(a=0),嘿嘿!");}return 250;}public static void main(String[] args) {FinallyTest2 t=new FinallyTest2();System.out.println("方法返回(return) :"+t.test());}}
/*
運行結果:Finally執行,a值為:1314520小鬧一下(a=0),嘿嘿!方法返回(return) :1314520總結:在try語句塊中運行到了return時,并不是立即返回而是把return要返回的值計算出來先保存到內存中,然后去執行finally語句塊,然后再返回之前保存要return的值。
*/
四、在返回之前執行在finally塊中的語句,哪finally塊中也return會怎么樣呢?
public class FinallyTest3 {//@SuppressWarnings 批注允許您選擇性地取消特定代碼段(即,類或方法)中的警告。@SuppressWarnings("finally") private int test(){ try{return 520;}catch(Exception e){System.out.println();}finally{return 5820; //此處return語句會產生警告}}public static void main(String[] args) {FinallyTest3 t=new FinallyTest3();System.out.println("方法返回(return) :"+t.test());}
}
/*
運行結果:方法返回(return) :5820總結:如果try和finally都有return 語句,則返回值以最后一個return語句的值作為返回,前面的一個被默認的犧牲啦。
*/