黑马程序员技术交流社区

标题: try {}里有一个return语句,那么紧跟在这个try后的finally {}里... [打印本页]

作者: hmwudizl91zl    时间: 2013-10-6 11:32
标题: try {}里有一个return语句,那么紧跟在这个try后的finally {}里...
本帖最后由 hmwudizl91zl 于 2013-10-6 17:36 编辑

在看到后面这段代码前的我的答案是在return之前,看完之后我发现,但往更细地说,答案是在return中间执行
下面就是这段代码:
public classTest {
     /**
     * @paramargs add by zxx ,Dec 9, 2008
     */
    public static voidmain(String[] args) {
       // TODO Auto-generated method stub
       System.out.println(newTest().test());;
    }
     static int test()  {
       int x = 1;
       try{
           returnx;
       }
       finally {
           ++x;
       }
    }
   }

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


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



作者: 黑马戴帅军    时间: 2013-10-6 13:11
本帖最后由 黑马戴帅军 于 2013-10-6 13:16 编辑

finally代码块中是一定会被执行的代码。
但是你的finally代码块中只对x进行了+1的运算,但是并没有对x的值进行返回或打印。如果finally中写了return的方法,那么输出的就是2.不写return的话就是1.但是try中的return方法从代码开始执行,就确定下来了。
  1. class Test {
  2.    
  3.    public static void main(String[] args) {
  4.       System.out.println(new Test().test());;
  5.    }
  6.     static int test()  {
  7.       int x = 1;
  8.       try{
  9.           return x;
  10.       }
  11.       finally {
  12.           ++x;
  13.           return x;//此处返回x的值。
  14.       }
  15.    }
  16.   }
复制代码
try中的return是在finally代码块之后执行的。从下面的代码可以看出。
  1. class Test {
  2.    
  3.    public static void main(String[] args) {
  4.       System.out.println(new Test().test());;
  5.    }
  6.     static int test()  {
  7.       int x = 1;
  8.       try{
  9.           return x;
  10.       }
  11.       finally {
  12.           ++x;
  13.           System.out.println(x);//对x的值进行打印。输出结果是2和1
  14.                                            //由此可以看出,finally代码块是在try之前的代码执行的。

  15.       }
  16.    }
  17.   }
复制代码
希望可以帮到你。
作者: 麦子    时间: 2013-10-6 15:03
finally是一定会执行的,只有代码中有system.exit() 这种情况 才不会执行finally,因为该句终止了虚拟机进程

finally会在return之前执行,应为在return执行后,该函数就结束了,而finally又是一定要执行的代码域,所以应该是在之前执行

如果在finally里面有return情况会更复杂
作者: 乔兵    时间: 2013-10-6 16:15
问题解决后,请修改帖子分类为:提问结束




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