public class TestFinally {
    static int i;
    public static void main(String[] args) {
        System.out.println("程序执行至main()时i的值为:"+returnValue());
    }
    
    public static int returnValue(){
        i=0;                      // L1
        try{                
            i = 1;                // L2
            return i = i + 5;     // L3
        } finally {
            i = 4;                // L4
            System.out.println("程序执行至finally时i的值为:"+i);
        }
    }
}
程序执行至main()时i的值为6,为什么不是9.

解决方案 »

  1.   

    应该是一个方法里面的return后面的代码不会执行的.
      

  2.   

    问题在于执行finally的时候走到 return i = i + 5;这句的时候方法的返回值就已经确定了,由于有finally的存在java虚拟机先将这个返回值保留,然后去执行finally的代码,然后再返回方法的返回值。
      

  3.   

    finally里面的代码仍然会执行,执行后i值应该为4。但是执行前方法的方法的返回值已经确定了
      

  4.   

    一个方法的值是由return的返回值确定的,lz想的应该是把i的值得出吧!
      

  5.   

    finally后面的会执行的,只是之前return的值已经确定了
      

  6.   

    return 会记住返回值的。
    return i = i + 5;     // L3 
    到这里,i的值是6
    所以return 会记住,它要返回6所以就算你在finally里面改变了i的值,对return也不会有影响!
      

  7.   

    帮你反编译了下
      
     public static void main(String args[])
        {
            System.out.println((new StringBuilder("\u7A0B\u5E8F\u6267\u884C\u81F3main()\u65F6i\u7684\u503C\u4E3A\uFF1A")).append(returnValue()).toString());
        }    public static int returnValue()
        {
            i = 0;
            int j;
            i = 1;
            j = i += 5;
            i = 4;
            System.out.println((new StringBuilder("\u7A0B\u5E8F\u6267\u884C\u81F3finally\u65F6i\u7684\u503C\u4E3A\uFF1A")).append(i).toString());
            return j;
            Exception exception;
            exception;
            i = 4;
            System.out.println((new StringBuilder("\u7A0B\u5E8F\u6267\u884C\u81F3finally\u65F6i\u7684\u503C\u4E3A\uFF1A")).append(i).toString());
            throw exception;
        }    static int i;