關於try,finally執行順序的分析

 try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,什麼時候被執行,在return前還是後?

 

  1. public class test { 
  2.  
  3.     /** 
  4.      * @param args 
  5.      */ 
  6.     public static void main(String[] args) { 
  7.         // TODO Auto-generated method stub 
  8.         System.out.println(new test().test());; 
  9.     } 
  10.  
  11.     static int test() 
  12.     { 
  13.         int x = 1; 
  14.         try 
  15.         { 
  16.             return x; 
  17.         } 
  18.         finally 
  19.         { 
  20.             ++x; 
  21.             System.out.println(x); 
  22.             System.out.println("aaa"); 
  23.         } 
  24.     } 
  25.  

輸出結果爲:

2

aaa

1

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

public class  smallT

{

       public static void  main(String args[])

       {

              smallT t  = new  smallT();

              int  b  =  t.get();

              System.out.println(b);

       }

      

       public int  get()

       {

              try

              {

                     return 1 ;

              }

              finally

              {

                     return 2 ;

              }

       }

}

 

返回的結果是2。

我可以通過下面一個例子程序來幫助我解釋這個答案,從下面例子的運行結果中可以發現,try中的return語句調用的函數先於finally中調用的函數執行,也就是說return語句先執行,finally語句後執行,所以,返回的結果是2。Return並不是讓函數馬上返回,而是return語句執行後,將把返回結果放置進函數棧中,此時函數並不是馬上返回,它要執行finally語句後才真正開始返回。

在講解答案時可以用下面的程序來幫助分析:

public  class Test {

 

    /**

     *@paramargsaddbyzxx,Dec9,2008

     */

    publicstaticvoid main(String[] args) {

       // TODO Auto-generated method stub

       System.out.println(new Test().test());;

    }

 

    int test()

    {

       try

       {

           return func1();

       }

       finally

       {

           return func2();

       }

    }

   

    int func1()

    {

       System.out.println("func1");

       return 1;

    }

    int func2()

    {

       System.out.println("func2");

       return 2;

    }  

}

-----------執行結果-----------------

 

func1

func2

2

 

結論:finally中的代碼比return 和break語句後執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章