黑马程序员技术交流社区

标题: 关于try,finally的小问题 [打印本页]

作者: 一碗小米周    时间: 2014-5-29 23:12
标题: 关于try,finally的小问题
public  class Test {

        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呢?求解。谢谢


作者: 没壳的蜗牛    时间: 2014-5-30 00:06
你只在try中返回,并没有在finally代码块中返回,所以返回的当然是1啦!将你代码稍该了一下输出就是2了。
  1. package cn.liangfan.learningProblems;

  2. public class TestDemo2 {

  3.         public static void main(String[] args) {
  4.         // TODO Auto-generated method stub
  5.         System.out.println(new TestDemo2().test());;
  6. }

  7.         public static int test()
  8.         {
  9.                 int x = 1;
  10.                 try
  11.                 {
  12.                   //return x;
  13.                 }
  14.                 finally
  15.                 {
  16.                         return ++x;
  17.                 }
  18.         }
  19. }
复制代码


作者: 帅哥哥    时间: 2014-5-30 01:25
我觉着吧,try中执行到了return,然后返回,虽然finally中一定执行,但是是在return之后执行的,你可以在finally中加一句 System.out.println(x); 会看到打印了2的~~~
作者: ★魔_➩τ咒    时间: 2014-5-30 01:29
我也觉得很迷茫
作者: 张百振    时间: 2014-5-30 01:36
严格来说,在finally的return同时存在的情况下,finally代码里边是在两次return之间执行的,
第一次:当代码看到return的时候,返回路径已经生成,也就是这个时候返回的路径上不再是单单返回某一个变量了,而是一个具体的值,此时路径已经生成
但是:生成返回路径的一瞬间,系统又看到了finally,所以又去执行finally中的代码,此时,在finally中给变量赋值仅仅是变量值的改变,并不影响已经生成的返回的那个常量值
第二次:当执行完finally代码之后,系统会将之前生成的返回路径的那个常量值做返回操作
所以呢,finally语句是在两次return之间执行的







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