Finally语句块的运行
一、finally語句塊是否一定運行?
Java中異常捕獲機制try...catch...finally塊中的finally語句是不是一定會被運行?非常多人都說不是。當然他們的回答是正確的,經(jīng)過試驗。至少下面有兩種情況下finally語句是不會被運行的:
(1)異常捕獲機制finally塊與try和catch塊是關(guān)聯(lián)的。既然是關(guān)聯(lián)的假設try...catch...finally語句邏輯上達不到?jīng)]有被運行,如在try語句之前就返回了,這樣finally語句就不會運行,這也說明了finally語句被運行的必要而非充分條件是:對應的try...catch...finally語句一定被運行到。
(2)在try塊中有System.exit(0);這種語句,System.exit(0);是終止Java虛擬機JVM的。連JVM都停止了。所以都結(jié)束了,當然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語句塊的繼續(xù)運行,嘿嘿……");}}public static void main(String[] args) {FinallyTest1 t=new FinallyTest1();t.test();} }/*運行結(jié)果:Try statement block……在try語句塊中return你再強大,也影響不了我finally語句塊的繼續(xù)運行,嘿嘿……總結(jié):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()); } } /* 運行結(jié)果: Finally運行,a值為:1314520 小鬧一下(a=0),嘿嘿。 方法返回(return) :1314520 總結(jié): 在try語句塊中運行到了return時,并非馬上返回而是把return要返回的值計算出來先保存到內(nèi)存中, 然后去運行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語句會產(chǎn)生警告}}public static void main(String[] args) {FinallyTest3 t=new FinallyTest3();System.out.println("方法返回(return) :"+t.test());} } /* 執(zhí)行結(jié)果:方法返回(return) :5820總結(jié):假設try和finally都有return 語句。則返回值以最后一個return語句的值作為返回,前面的一個被默認的犧牲啦。 */總結(jié)
以上是生活随笔為你收集整理的Finally语句块的运行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 命令行编译c#源程序
- 下一篇: 附近有什么?8款可以查周边的App