我在網上搜尋了一些資料,下面是參考代碼:
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