一、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語句的值作為返回,前面的一個被默認的犧牲啦。
*/