黑马程序员技术交流社区

标题: 关于try catch finally运行的疑问 [打印本页]

作者: 李春阳    时间: 2012-6-7 17:37
标题: 关于try catch finally运行的疑问
首先是背景~

大家都知道try catch 语句中 finally是一定会执行的语句。

而return语句会返回一个值,且之后就不运行了~

那俩个加一起会怎么样呢。。

try{
  return false;
}

finally{
  return ture;
}

try catch finally这个语句在try里面的return就停下来呢?还是会怎样

最终返回什么值呢~首先是背景~

大家都知道try catch 语句中 finally是一定会执行的语句。

而return语句会返回一个值,且之后就不运行了~

那俩个加一起会怎么样呢。。

try{
  return false;
}

finally{
  return ture;
}

try catch finally这个语句在try里面的return就停下来呢?还是会怎样

最终返回什么值呢~
作者: 伊文龙    时间: 2012-6-7 17:51
当finally里面有return语句的时候,finally里的代码就不会被执行,否则,会在try里面的return 前执行。
作者: 罗文杰    时间: 2012-6-7 17:54
你的这个例子里,结果执行的是 finally里面的return;
比如说:
int x = 1;
try{
  return x;
}

finally{
  x++;
}
这时return的x的值还是1;
虽然finally执行了x++;但是try语句在return的时候就是当时x的值,他告诉调用他的函数我要return了,然后程序去执行 finally里面的x++;但是这时x的值跟return语句毫无关系,执行finally完毕后return 的还是x=1;如果finally里面有return语句的话:
int x = 1;
try{
  return x;
}

finally{
  x++;
return x;
}
这个时候在执行finally的时候 finally就抓住机会把return的值返回给了调用他的函数,就是return的值x=2。

作者: 伊文龙    时间: 2012-6-7 17:57
我感觉在在finally里面定义return语句,是没有意义的,finally子句为异常提供一个清理机制,一般用来释放使用的系统资源。
在finally里面定义return,有点喧宾夺主的意思,毕竟代码的主体在try语句中,这样违背常理的事情,java设计者应该不会干~~~
作者: 胡宝林    时间: 2012-6-7 18:02
finally只有在退出虚拟机的时候不执行

public class Demo {
public static void main(String[] args) {
  try{
   System.exit(0);         //退出虚拟机后,finally中的代码就不会执行了,其他的无论什么情况都会执行finally中的代码
  }catch (Exception e) {
     }finally{
   System.out.println("haha");
  }
}
}
//还有就是在finally中的代码如果抛出异常,则finally中的代码不会再往下执行,如
finally{
          x=1/0;                           //这句代码会抛出算术异常,此时不会再执行下面的 System.out.println("haha");
      System.out.println("haha");
      }


作者: 雷云红    时间: 2012-6-7 18:08
首先纠正一点,finally.不一定必须执行
作者: 杨永峰    时间: 2012-6-7 21:59
本帖最后由 杨永峰 于 2012-6-7 22:25 编辑

和这个帖子的问题很相似,但是似乎答案依然存在分歧:http://bbs.itheima.com/forum.php ... 366&page=1#pid93915
以及这个http://bbs.itheima.com/thread-16500-1-1.html。除了JVM终止,最终return的值和异常语句所处的语句环境(上级代码块)有关,我坚持我在帖子回复的一个测试,先try中的语句块执行,然后finally执行。
作者: 杨天皓    时间: 2012-6-7 22:59
这么这个问题这么多人讨论。
我还是坚持我的理解。

就算在try里面遇到了return,那程序会先看有没有finally语句,如果有,就先执行了finally,再回到try。

下面这个代码也很明白。try遇到了return ,这个时候a=true,然后程序一看有finally,执行了finally,现在a=false,这个时候回到try,直接return  a 出去,而这个时候a=false.
        public static void main(String[] args)
        {
                System.out.println(test1());
        }
        
        public static  boolean test1()
        {
                boolean a = true;
                try {
                        
                        return a;
                } finally
                {
                        a = false;
                        System.out.println("进来finally了");
                        return a;
                        
                }
        }




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2