废话不说,大家直接来看源代码public class Test_4 { public static void main(String[] args) {
System.out.println(test()); }
public static int test() {   
    int j = 0;   
    try {   
        j = 1;   
        System.out.println("try:" + j);   
        return j;   
    }catch (Exception e) {   
        // TODO: handle exception   
    }finally {   
        j = 2;   
        System.out.println("finally:" + j);
    }   
    return j;   
}  }这里输出什么?我有一点不明白,finally里把j的值改变了,为什么返回的确是1?
在这里,小弟谢谢各位!

解决方案 »

  1.   


    为什么 因为你finally 没有 返回值,如果return j;就不一样了
     public static void main(String[] args) {
            System.out.println(test());     }
        @SuppressWarnings("finally")
    public static int test() {   
            int j = 0;   
            try {   
                j = 1;   
                //System.out.println("try:" + j);   
                return j;   
            }catch (Exception e) {   
                // TODO: handle exception   
            }finally {   
                j = 2;   
                System.out.println("finally:" + j);
                return j;
            }   
            //return j;   
        }  
      

  2.   

    amdgaming 感谢你的回答。
    但是你能不能讲讲如果在不加return的情况下为什么不对?
    程序finally是无论如何都会执行的,应该也是在try里return之前执行,在funally中已经改变了j变量的值。之后再return啊。
      

  3.   

    方法只有一个return能执行,程序最后的return并没有被调用,方法返回的是第一个return j,就是1了
      

  4.   

    如果你把第一个return注释掉,再调试看看,那就是2了
      

  5.   

    恩,谢谢。这个我明白。
    但是这个执行顺序是什么样的呢?j = 1;   
    System.out.println("try:" + j);j = 2;   
    System.out.println("finally:" + j);return j;是这样么?
      

  6.   

    同样的意思换一种引用类型public static void main(String[] args) {
    Person p = new Person();
    Person p1 = testPerson(p);
    System.out.println(p1.name);
    }

    public static Person testPerson(Person p) {   
        try {   
            p.name = "try";   
            return p;   
        }catch (Exception e) { 
        }finally {   
            p.name = "finally";   
        }        
        p.name = "last";   
        return p;
    }  
    }
    class Person {   
        String name;
        Person() {
        } 难道是因为引用类型和值类型的差别吗?
      

  7.   

    因为只有一个return返回 你第一步有个return  结果   finally 必须执行  加入没有finally就不往下面执行  所以就是
      

  8.   


    所以顺序是:仅执行了try中的内容
      

  9.   

    有return也是执行的。您可以写个程序来测试一下。
      

  10.   

    得到答案了。有兴趣的朋友可以看一下这个链接:
    http://zangxt.javaeye.com/blog/421508
    谢谢各位的回答
      

  11.   

    建议LZ详细了解一下关于JAVA的内存存储方式 对return返回的内容和内存存储做一个了解 问题就可以解决了
      

  12.   

    finally 无论return写在哪里都要执行finally块
      

  13.   

    顶一楼 具体原因我也不解释了 很明显了 说的太白也没意思 lz实在搞不懂 可以多试试return语句 自己调试一下 这问题没什么技术含量
      

  14.   

    都他妈废话,自己写一个,生成java文件,编译成.class类文件,然后反编译一下,或者在eclipse中跟踪就会知道啦。
    具体的我在说一下,这里的代码运行的是先执行到try{}里面的语句,在try里面执行到return的时候,这时系统会返回,然而虚拟机不会这样执行他会判断一下有没有finally语句,然而要执行fnally语句的时候。他会保存return的现场,会用一个变量保存,但是在eclipse里面和在dos下执行的话,这个保存现场的变量声明的不一样,一个事char定义的变量保存,一个是byte类型的变量生成。
    下面如果在finally里面执行在到这个修改返回变量的时候,就会又生成该变量的现场,但是不会保存,
    执行完finally以后,在返回try里面的语句,这是由执行保存的现场,,所以返回的就是那个变量1啦。