程序代码如下public class TryCatchFinally {
public static int work() {
int result = 0;
try {
System.out.println("try block");
result++;
return result;
} catch (Exception e) {
System.err.println("catch block");
return result;
} finally{
System.out.println("finally block");
result++;
System.out.println("result = "+result);
} }

public static void main(String[] args) {
System.out.println("result = "+work());
}}
finally块的代码会在try块的return语句之前执行,所以分析来看输出应该是
try block
finally block
result = 2
result = 2但是实际运行的输出结果却是
try block
finally block
result = 2
result = 1把result改成类的全局变量还是这样的输出结果,是return的时候出现的问题吗?

解决方案 »

  1.   

    return 的时候把返回值压栈,然后继续执行finally的代码,执行结束以后把返回值出栈,再把返回值返回去
      

  2.   

    小弟也不明白为什么结果会是
    try block
    finally block
    result = 2
    result = 1
    为什么System.out.println("result = "+result);执行了两次,而且结果不一样
    求大侠指点
      

  3.   

    对于引用类型,比如String,return执行的时候是返回引用变量,还是引用变量指向的具体内容?
      

  4.   

    http://topic.csdn.net/u/20120607/07/9d3a5948-ca38-4eb9-a4f8-63400b34e13a.html
      

  5.   

    引用类型返回引用(也就是对象的地址),String比较特殊(包括基本类型的封装类型),因为没法修改它们的属性,所以return的只会是finally修改之前的引用(也就是说你在finally对引用变量做任何操作没有任何影响)
      

  6.   

    刚执行了一下代码
    看了一下执行的顺序try
    try blockfinally
    finally block
    result = 2再执行了try里的return
    finally里改变返回值变量并不影响返回值本身
    result = 1结果就是
    try block
    finally block
    result = 2
    result = 1
      

  7.   

    这是必须的嘛:finally里面还有++,自然result=2;
    而你在catch里面就已经return了,此时的result=1;
    自然main方法调用放回的result=1。你哪里看错了吧。
      

  8.   

    由于你catch里面有一个return,所以当finally里面的代码执行的时候,main函数里的println方法的参数就已经确定为catch返回时的值了
      

  9.   

    如果你返回的是个引用类型,而在finally中修改该引用中的某个属性值的话,会导致返回对象也被相应修改。但是你要返回的是基本数据类型的话,就不会出现变化了。public class TryCatchFinally {
        public static Person work() {
            Person result = new Person();
            try {
                System.out.println("try block");
                result.setName("name");
                return result;
            } catch (Exception e) {
                System.err.println("catch block");
                return result;
            } finally{
                System.out.println("finally block");
                result.setName("name1");
                System.out.println("result = "+result.getName());
            }    }
        
        public static void main(String[] args) {
                System.out.println("result = "+work().getName());
        }
    }class Person {
    private String name; public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    }
    }
      

  10.   

    好像finally少了 return,不过结果还是一样的
      

  11.   

    我想知道如果将return result也加到finally最后,会输出什么?还会是1吗?