try {}里有一个 return 语句,那么紧跟在这个 try
后的 finally {}里的 code 会不会被执行,什么时候被执
行,在 return 前还是后?   我知道finaly应该是在return之前执行,可是下面的代码为什么执行的时候结果会是1呢?
public  class Test {     public static void main(String[] args) { 
       // TODO Auto-generated method stub 
       System.out.println(new Test().test());; 
    } 
  
    static int test() 
    { 
       int x = 1; 
       try 
       { 
           return x; 
       } 
       finally 
       { 
           ++x; 
       } 
    } 
     

解决方案 »

  1.   

    当然是1啊代码执行顺序啊。  finally里的代码会执行,是在它之上的代码运行完之后。
    你再finally 外边 输出x 就变成2了
      

  2.   

    而且你的理解有问题。 try的语句块执行完以后,finally中的语句块才会执行。
    finally里一般执行清扫工作,比如关闭连接等,如果finally先执行的话,请问要try干嘛
      

  3.   

    return一下,就表示方法结束了
      

  4.   

    先执行return语句,但不真正返回,将得到的X值放在一个临时变量里面,然后执行finally语句X变成2,接着返回临时变量里面的X值
      

  5.   

    首先,执行try块中return之前的部分
    接着,转入finally块继续执行,如果finally块没有返回语句,执行完finally块,再回到try块,执行return语句.
    注意: 这种执行顺序只是保证了finally块一定会被执行, 但finally块的执行结果对try块的return没有影响.
    如果finally里面有return,try中的return不会再执行
    如果try中有了异常,try中的return也不执行
    程序在catch块中的执行情况,和try块是一样的
      

  6.   

    参考我这个帖子,17F、18F的回答
    http://topic.csdn.net/u/20111009/19/dc661ee7-ab58-4ee3-931d-93a7630d18f2.html也就是说,函数返回值是当时运行到return这行时候整个return 表达式的结果,也就是当时x的值。
    而不是到了return再去执行finally,然后回过头来再去运行return 表达式,求当时(finally运行以后)表达式的值
      

  7.   

    这个问题都出现了好多次了,返回的x肯定=1 但是finally 的语句是执行在try return 之前
      

  8.   


    只是有点不明白finally执行之后X的值应该是2,return返回X的值也应该是2才对
      

  9.   

    try里面System.exit(0),才不会执行finally里面的语句
      

  10.   

    try中如果没报错,就会按照顺序来执行的。
      

  11.   

    try运行完毕之后才运行finally。也就是返回1之后x的值才变成2
      

  12.   

    楼主 不能自已试下吗?
    try{
    System.out.println(1);
    return;
    }finally{
    System.out.println(2);
    }
      

  13.   

    看字节码:
    static int test();
      Code:
       Stack=1, Locals=3, Args_size=0
       0: iconst_1  //常量1压栈
       1: istore_0  //把栈顶元素存储到局部变量0里面
       2: iload_0   //把局部变量0压栈
       3: istore_1  //把栈顶元素存储到局部变量1里面
       4: iinc 0, 1 //局部变量0加1
       7: iload_1      //把局部变量1压栈
       8: ireturn      //返回栈顶元素
       9: astore_2     //异常信息存储在局部变量2里面
       10: iinc 0, 1  //局部变量0压栈,加1
       13: aload_2       //局部变量2压栈
       14: athrow        //抛出栈顶元素第4条指令:
    4: iinc 0, 1 //局部变量0加1
    这就是执行finally里面的内容看第7条和第8条指令:
    7: iload_1      //把局部变量1压栈
    8: ireturn      //返回栈顶元素
    这是return语句。
      

  14.   

    先执行try,在执行 finally
    这是我修改你的程序,研究的
    public class Test {    public static void main(String[] args) {  
      
      System.out.println(new Test().test());;  
      }  
       
      static int test()  
      {  int x = 1;
      System.out.println(x);
      try { 
      
      try{
          System.out.println(x);
          return x;
          }
      finally{
      x++;
          System.out.println(x);
          return x;
           }
      
          }
     

     finally  {
     System.out.println(x);

    }
     }
      }
      

  15.   

    上面的2个return,你屏蔽一个用,就发现了 
      

  16.   

    finally 的语句是执行在try return 之前