try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,還是在return之后執行?


這是一個很有趣的問題,我測試的結果是:是在return中間執行。

我在網上搜尋了一些資料,下面是參考代碼:

 1 /**
 2  * 
 3  */
 4 package com.b510.test;
 5 
 6 /**
 7  * try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,還是在return之后執行?
 8  * @author Hongten
 9  * @date 2013-12-10
10  */
11 public class TestC {
12 
13     @SuppressWarnings("static-access")
14     public static void main(String[] args) {
15         System.out.println("結果: " + new TestC().test());
16     }
17     
18     static int test(){
19         int i = 1;
20         try {
21             System.out.println("try里面的i : " + i);
22             return i;
23         }finally{
24             System.out.println("進入finally...");
25             ++i;
26             System.out.println("fianlly里面的i : " + i);
27         }
28     }
29 }

輸出結果:

try里面的i : 1
進入finally...
fianlly里面的i : 2
結果: 1

下面是我在debug時,抓取的圖片:

上圖是程序執行到try模塊里面:變量"i"的值的情況。

上圖是程序執行到了try模塊中的return語句時,按下F5鍵,進入到finally模塊,執行finally模塊中的語句后,變量"i"的值發生了變化。

上圖是當程序執行完finally模塊后,返回到return代碼塊。

但是在最后的運行效果中,我們看到的結果是:1,而不是我們想象中的:2

為什么會出現這樣的情況:

上面我認為比較靠譜的一種解釋。

還有一種解釋為:

主函數調用子函數並得到結果的過程,好比主函數准備一個空罐子,當子函數要返回結果時,先把結果放在罐子里,然后再將程序邏輯返回到主函數。所謂返回,就是子函數說,我不運行了,你主函數繼續運行吧,這沒什么結果可言,結果是在說這話之前放進罐子里的。

 

========================================================

More reading,and english is important.

I'm Hongten

 

大哥哥大姐姐,覺得有用打賞點哦!多多少少沒關系,一分也是對我的支持和鼓勵。謝謝。
Hongten博客排名在100名以內。粉絲過千。
Hongten出品,必是精品。

E | hongtenzone@foxmail.com  B | http://www.cnblogs.com/hongten

========================================================


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM