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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一碗小米周 中级黑马   /  2014-5-29 23:12  /  1640 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

4 个回复

正序浏览
严格来说,在finally的return同时存在的情况下,finally代码里边是在两次return之间执行的,
第一次:当代码看到return的时候,返回路径已经生成,也就是这个时候返回的路径上不再是单单返回某一个变量了,而是一个具体的值,此时路径已经生成
但是:生成返回路径的一瞬间,系统又看到了finally,所以又去执行finally中的代码,此时,在finally中给变量赋值仅仅是变量值的改变,并不影响已经生成的返回的那个常量值
第二次:当执行完finally代码之后,系统会将之前生成的返回路径的那个常量值做返回操作
所以呢,finally语句是在两次return之间执行的


回复 使用道具 举报
我也觉得很迷茫
回复 使用道具 举报
我觉着吧,try中执行到了return,然后返回,虽然finally中一定执行,但是是在return之后执行的,你可以在finally中加一句 System.out.println(x); 会看到打印了2的~~~

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你只在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. }
复制代码

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马