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

--------------------------------------------------------------------------------------

public class finallyTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("結果: " + new finallyTest().test());
    }

    int test(){
        int i = 1;
             try {
                     System.out.println("try裏面的i : " + i);
                     return i;
                 }finally{
                     System.out.println("進入finally...");
                     ++i;
                     System.out.println("fianlly裏面的i : " + i);
                     return i;
              }
        
    }

}

輸出結果:

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

 

 

 

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

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

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

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

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

爲什麼會出現這樣的情況:

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

還有一種解釋爲:

主函數調用子函數並得到結果的過程,好比主函數準備一個空罐子,當子函數要返回結果時,先把結果放在罐子裏,然後再將程序邏輯返回到主函數。所謂返回,就是子函數說,我不運行了,你主函數繼續運行吧,這沒什麼結果可言,結果是在說這話之前放進罐子裏的。
當有第二個return的時候,主函數就會將上一個結果覆蓋,
所以對於上面第二種情況的輸出結果:一開始main函數的空罐子接收的是i=1,後面執行finally,將i=2返回,所以最後輸出的結果是i=2