tryについて、finallyの実行順の面接問題


try{}の中にreturn文がありますが、このtryの後に続くfinally{}のコードは実行されますか?いつ実行されますか?
 

  
  
  
  
  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
aa
1
 
なぜですか?メイン関数がサブ関数を呼び出し、結果を得るプロセスは、メイン関数が空き缶を用意して、サブ関数が結果を返すときは、まず結果を缶に入れてから、プログラム論理をメイン関数に戻します。リターンとは、サブ関数のことです。私はもう動かないので、あなたのメイン関数は続けて運転してください。これは何の結果もないです。結局、この話をする前に缶に入れたのです。
public class  small T
{
       public static void  main(String args[])
       {
              smaltlt  = new  smaallT();
              要点  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{
 
    /**
     * @param args add by zxx,Dec 9,2008
     */
    public static void main(String[]args){
       // TODO Auto-generated methodb stub
       System.out.println(new Test().test();
    }
 
    int test()
    {
       try
       {
           return func 1()
       }
       finally
       {
           return func 2()
       }
    }
   
    int func 1()
    {
       System.out.println(「Fnc 1」)
       return 1;
    }
    int func 2()
    {
       System.out.println(「Fnc 2」)
       return 2;
    }  
)
---------実行結果---------------------
 
func 1
func 2
2
 
結論:finallyのコードはreturnとbreak文より後に実行されます。