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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hel 中级黑马   /  2013-11-10 10:47  /  1496 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Test {

   
    public static void main(String[] args) {
        int a = Test.test();
        System.out.println(a);
    }
     
    static int test() {
        int x = 1;
        try {
            return x;
        }
        finally
        {
            ++x;
        }
    }
}


大家猜猜 会输出什么呢?

点评

这个问题不是问过了么  发表于 2013-11-10 14:55

9 个回复

倒序浏览
FFF 金牌黑马 2013-11-10 11:22:13
沙发
只输出了 return x;
finally没有执行,同问为什么呢?不是说Finally必定会执行的吗?
回复 使用道具 举报
本人的答题,正好复制上来
解题:因为return语句在返回值的同时会结束该方法,所以在try和finally中都加入return语句,根据返        回值来判断执行顺序。

附:经测试,判断finnaly语句先执行,这里因为我在finnally加入return语句结束该try方法,所以try中retrun并没有返回数值,当finally中只有x++语句时,返回值为2,并不是为3,也就是说x++的值并没有赋给x+2语句中的x,我的理解是,当try语句执行到return时,已经确定了返回值0+2,也就是说该return语句已经完成x+2语句的操作后被finally抢去执行权,这时候x++已经影响不到return语句的返回值。
*/

class Test
{
        public static void main(String[] args)
        {
                System.out.println(judge());
               
        }
        public static int judge()
        {
                int x = 0;
                try
                {
                        return x+2;
                }
                finally
                {
                        return x++;
                }
        }
}
回复 使用道具 举报
我认为是1,try里面return x 已经返回了1 ,finally执行是在执行return后
回复 使用道具 举报
FFF 金牌黑马 2013-11-10 12:42:09
报纸
本帖最后由 FFF 于 2013-11-10 12:43 编辑

我把代码改成这样、问题一目了然。
  1.             static int test() {
  2.                 int x = 1;
  3.                 int a = 100;
  4.                 try {
  5.                         System.out.println("AAA");
  6.                     return a;
  7.                 }
  8.                 finally
  9.                 {
  10.                         System.out.println("xxx");
  11.                    return ++x;
  12.                 }
  13.             }
复制代码
运行结果:
AAA
xxx
2

try中的a有运行,而且是先运行。AAA就是证明。而且有返回值100,为什么没有显示100?下面说、
finally是最后运进,xxx是证明。如果finally写了return则会覆盖之前的返回值100,变成x++=2。如果没有写return则没有返回值,x++只是自增,并不显示在输出中,会输出a的值100。
总算搞明白了!
回复 使用道具 举报
寻丶丶觅 发表于 2013-11-10 11:35
本人的答题,正好复制上来
解题:因为return语句在返回值的同时会结束该方法,所以在try和finally中都加入r ...

你的意思是 finally是先于return执行了  ,但并没影响到return所返回的值
回复 使用道具 举报
输出结果是1。
我们将代码稍微修改,看看限制性Finally还是return,在Finally里加入System.out.println("Hello World");修改后代码如下:
  1. public class Test {

  2.    
  3.     public static void main(String[] args) {
  4.         int a = Test.test();
  5.         System.out.println(a);
  6.     }
  7.      
  8.     static int test() {
  9.         int x = 1;
  10.         try {
  11.                         return x;
  12.         }
  13.         finally
  14.         {
  15.                         System.out.println("Hello World");
  16.                         x++;
  17.         }
  18.     }
  19. }
复制代码
输出结果为:
Hello World
1
    由此可见,Finally先执行了,但为什么没有影响到return?正如3楼所说的:是因为return语句已经完成语句的操作后被finally抢去执行权,这时候Finally中++x已经影响不到return语句的返回值。
    Finally执行有以下三种可能出现的情况:
    (1)如果try中没有出现异常,执行Finally中的语句,然后执行Try语句的下一条语句。
    (2)如果Try中有一条语句会引起异常,并被catch块捕获,然后跳过Try块的其他语句,执行catch块的Finally子句,最后执行Try语句之后的下一条语句。
    (3)如果Try中有一条语句会引起异常,但没有被catch块捕获,就会跳过Try块的其他语句,执行Finally子句,并且将异常传给调用者。
     楼主的情况属于第一种。

回复 使用道具 举报
可以把finally块理解成调用了一个方法,
finally块中只能改变相关变量的堆中的值
而不能改变栈中的值
回复 使用道具 举报
dolphin 中级黑马 2013-11-10 15:56:11
9#
本帖最后由 dolphin 于 2013-11-10 15:58 编辑

jvm虚拟机中规定,finally会在return语句之后执行,用return方法之后,该方法将终止继续。
既然定义test方法为static,那么在主函数中直接写就行了,但是输出时怎么写决定它的值是多少
(1)
test();
它的结果为
AAA
xxx
(2)
int a = Test.test();
System.out.println(test());
这样写后它的结果为
AAA
xxx
2

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