class text{    
    public static void main(String[] args) {    
        System.out.println(testt());
        System.out.println(x); 
        
    }    
       
    static int x = 99;
    public static int testt() {    
        try {  
           return x;    
       } catch (Exception e) {    
       } finally {    
           x = 8;
           
       }    
       return x;    
   }    
}   
 运行结果为:
99
8
按顺序执行为什么第二个为8?

解决方案 »

  1.   

    finally永远在最后执行,包括return。
      

  2.   

    因为你调用testt方法时,finlly代码块一定会被执行,所以x值变为8了
      

  3.   

    是因为return回去后,还继续执行finally 改变了x的值。
      

  4.   

    x的作用域为整个main方法,而且你调用test()方法的时候finally一定会执行,所以 System.out.println(testt());执行完。x就已经等于8了
      

  5.   

    如果按一楼说法确实一切都解释了,可调试是显示finally先执行然后才有return,楼下有几位没搞明白,我知道finaly会执行,可按调试过程finally执行完后X已经改变,为什么return值没变?各位可以调试看看
      

  6.   

    static与finally关系搞清楚了,就没什么困难了。
      

  7.   

    finally最后执行,但有返回值的时候,是在finally执行后才会返回的,但99未发生变化,原因在于在执行finally之前return已经取到x的值99,并压入栈中,所以(个人意见,猜想)
      

  8.   

    finally中没有return,返回的是try或catch里的return,此题是try中的return。但是如LZ所知finally在return前执行,为什么finally对返回值x的修改没有起到作用?因为方法在return的时候并不是把它拥有的那个值给返回了,而是把x复制了一份返回。
    所以99是x在finally前的复制,8是finally操作后x所存储额定值!总之:第一个返回的是x在finally前的复制值,第二个是直接返回的x
      

  9.   

    具体的为什么return返回的是复制值就要考虑到变量的存储地址了!基本类型和对象引用都存储在栈中,new出的的对象或数组存储在堆中。改写上述代码为:
    class text{   
      public static void main(String[] args) {   
      System.out.println(new text.testt());   //此为new对象放在堆中
      System.out.println(x);                  //static int x = 99;
                   
      }   
      

  10.   

    想问下楼上的大侠,在执行finally之前把x复制了一份,然后执行finally语句,再return,请问一下为什么这个return要返回这个副本呢?在复制和finally之间编译器又做了什么让return返回这个副本呢
      

  11.   

    刚才又看了一下,貌似我的理解错了,是先return(复制副本)->finally->return(真正跳转),是这样的吗?啊,我晕了。