黑马程序员技术交流社区

标题: try和finally里的return 你真的懂了嘛? [打印本页]

作者: .Mч┞尛__洋    时间: 2014-7-10 12:14
标题: try和finally里的return 你真的懂了嘛?
finally一定会执行吗?回答当然是否定的,假如在try里执行了System.exit(0)就不会再去执行finally了,守护线程中的finally碰到非守护线程全部退出的时候也可能执行不到。
又如下面的代码,会打印什么内容?
  1. public class Test {
  2.     public static void main(String... args) {
  3.         System.out.println(getValue1());
  4.         System.out.println(getValue2());
  5.     }

  6.     public static int getValue1() {
  7.         int i1 = 0;
  8.         int i2 = 1;
  9.         try {
  10.             return i1;
  11.         } finally {
  12.             return i2;
  13.         }
  14.     }

  15.     public static int getValue2() {
  16.         int i = 1;
  17.         try {
  18.             return i;
  19.         } finally {
  20.             i++;
  21.         }
  22.     }
  23. }
复制代码
大家说说自己的想法呗?

作者: yangcy    时间: 2014-7-10 12:24
1,1.        当try里return后,还是会执行finally中的程序的。并且返回值会覆盖。
作者: .Mч┞尛__洋    时间: 2014-7-10 15:48
yangcy 发表于 2014-7-10 12:24
1,1.        当try里return后,还是会执行finally中的程序的。并且返回值会覆盖。 ...

为什么?   说说原理
作者: heimacs    时间: 2014-7-10 16:26
yangcy 发表于 2014-7-10 12:24
1,1.        当try里return后,还是会执行finally中的程序的。并且返回值会覆盖。 ...

解释的很清楚!
作者: cheye0207    时间: 2014-7-11 01:41
呃。。。我也迷茫了,照这么看是先执行了return?
作者: .Mч┞尛__洋    时间: 2014-7-11 08:12
cheye0207 发表于 2014-7-11 01:41
呃。。。我也迷茫了,照这么看是先执行了return?

一会我考试,下午给你详细分析原因.
作者: mytongyong    时间: 2014-7-11 08:27
      finally是用来显示回收物理资源的,java虚拟机只能释放不用的内存空间,而无法释放物理资源,当打开相应的物理资源的时候,例如磁盘IO,或者网络连接,都需要finally来显示的释放。除非在try块、catch块里面调用了退出System.exit(1)方法,否则不管在try块,catch块中执行怎样的代码,出现怎样的情况,异常处理的finally块总会执行。所以说不要视图在finally块里面试图使用return或者throw语句,这将会导致返回值的结果被覆盖。




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