A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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. }
复制代码
大家说说自己的想法呗?

6 个回复

倒序浏览
1,1.        当try里return后,还是会执行finally中的程序的。并且返回值会覆盖。
回复 使用道具 举报
yangcy 发表于 2014-7-10 12:24
1,1.        当try里return后,还是会执行finally中的程序的。并且返回值会覆盖。 ...

为什么?   说说原理
回复 使用道具 举报
yangcy 发表于 2014-7-10 12:24
1,1.        当try里return后,还是会执行finally中的程序的。并且返回值会覆盖。 ...

解释的很清楚!
回复 使用道具 举报
呃。。。我也迷茫了,照这么看是先执行了return?
回复 使用道具 举报
cheye0207 发表于 2014-7-11 01:41
呃。。。我也迷茫了,照这么看是先执行了return?

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