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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱皓 中级黑马   /  2012-3-1 10:11  /  2107 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

      也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果:

public  class Test {



     /**

      * @param args add by zxx ,Dec 9, 2008

      */

     public static void main(String[] args) {

          // TODO Auto-generated method stub

          System.out.println(new Test().test());;

     }

     static int test()

     {

          int x = 1;

          try

          {

              return x;

          }

          finally

          {

              ++x;

          }

     }

}

---------执行结果 ---------

1

运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

这个答案我还是不明白,能不能更详细一些的答案

6 个回复

正序浏览
黄秋 黑马帝 2012-3-1 17:00:03
7#
LZ的东西,是来自就业面试宝典吧,把题目下面的“42、下面的程序代码输出的结果是多少?”也认真看看。既然宝典提到“在return中间执行”,就没那么简单。见下面代码:
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 System.out.println(new Test().test());
  4.     }
  5.          static int test()
  6.          {
  7.           int x = 1;
  8.           try
  9.           {
  10.                   return x;
  11.                 }
  12.           finally
  13.           {
  14.                   System.out.println(x);
  15.                   ++x;
  16.                   System.out.println(x);
  17.           }
  18.          }
  19. }
复制代码
结果是“1 2 1”,可见finally语句不但执行,x的值也改变了,但最后main打印的是“1”,原因如楼上有人说到的:
1. try中的return返回之前,会将返回值保存到一个临时变量,
2. 然后执行finally,若finally中有return,返回结果是finllay中return的值,
3. 若finally中无return,返回之前保存的临时变量。

点评

精辟!  发表于 2012-3-1 17:58
回复 使用道具 举报
这个finally一定会执行的,不管try里面有没有return,但是是先执行try{}这一块的,接着看catch到了异常没,再走finally,你在try{}这里面return返回了X值,那肯定上面输出的是这个当前值啊。
回复 使用道具 举报
根据《JVM Specification 3.0》的4.9.6节,在try中的return真正返回之前,会将false保存到一个临时变量(假设为var)中,然后执行finally,在执行finally子句的任何语句之前,会将var中的值取出,如果finally中没有抛出异常或return、break、continue等语句,则在finally执行完后返回var(相当于返回去完成try中return的执行),如果finally中有return,var值会被覆盖,返回结果是finllay子句中return的值,如果是异常或break、continue等则执行相应的操作而不是返回。更详细解释参考JVM规范或《深入理解JAVA虚拟机(第二版)》。
回复 使用道具 举报
  ++x;//是可到达的语句,finally语句会被执行,因为finally表示最终一定执行里面块的内容

return x;//在这表示只跳出try块里的内容,不执行try快中return下面的语句,但跳出后依然会执行finally块的内容

程序之所以结果为1,是因为在每次执行的时候都会对x初始化为1然后返回(实际上每执行一次,finally的++x都会让他变为2,第二次调用又被初始化为1了)。
回复 使用道具 举报
return 表示从被调函数返回到主调函数继续执行,返回时附带一个返回值,此时已跳出程序,后面的语句也就不执行了,
回复 使用道具 举报
return 语句后面的finally语句不会被执行,所以结果是1.因为return表示程序结束了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马