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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dev 中级黑马   /  2012-7-3 16:49  /  3029 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 翁游龙 于 2012-7-3 21:34 编辑

在网上看到一道这样的面试题觉得挺不错,但是自己琢磨了很久还是不理解。
在这里请教大家帮忙。程序如下:


public class TestDemo
{
        public static void main(String[] args)
        {
                System.out.println(new TestDemo().test());
        }


        public int test(){
                int x = 1;
                try{
                        return x;
                }finally{
                        ++x;
                }
        }
}


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


评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

14 个回复

倒序浏览
finally语句会执行
你就记着是在return之后执行.但是分两种情况
1,当finally语句块里面没有return语句时候,直接以函数内其他返回语句返回的值为该函数的最终返回值
2,当finally语句块里面有return语句的时候,要以finally里面的返回为最终返回值

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
finally语句无论怎样肯定是要执行的,在return后,所以打印结果肯定是1,如果在finally里的语句是return ++x;那结果就是2了
回复 使用道具 举报
先finally 再return,  你设个断点debug一下就知道了。
回复 使用道具 举报
车风波 发表于 2012-7-3 17:00
先finally 再return,  你设个断点debug一下就知道了。

如果是按你这么说先finally再return,而在finally语句块中已经是++1了,
但是结果为什么不是2呢?这里不是很明白哦。
回复 使用道具 举报
针对你的问题我写了如下测试程序:
public int test(){
                int x = 1;
                try{
                                System.out.println("执行try中的方法!");
                        return x;
                }finally
                {
                       
                    ++x;
                    System.out.println("执行finally里的方法." + x);
                }
        }
输出结果:
执行try中的方法!
执行finally里的方法.2
1

分析:
程序首先执行try中的语句,当发现有返回语句时,记录此时的返回值,程序继续执行,finally里的语句,此时在finally里改变了x的值,因为return语句在前,此时java没有为你,改变返回时的虽然这个已经改变,因为在逻辑上你的返回语句在前。
若改为
public int test(){
                int x = 1;
                try{
                                System.out.println("执行try中的方法!");
                  
                }finally
                {
                       
                    ++x;
                    System.out.println("执行finally里的方法." + x);
                   return x;
                }
        }
输出结果:
执行try中的方法!
执行finally里的方法.2
2
此时返回的便是2因为在逻辑上你是在finally里返回值。

由于好奇,我也写了如下代码:
public int test(){
                int x = 1;
                try{
                                System.out.println("执行try中的方法!");
                                return x;
                }finally
                {
                       
                    ++x;
                    System.out.println("执行finally里的方法." + x);
                   return x;
                }
        }
输出结果:
执行try中的方法!
执行finally里的方法.2
2

综合以上三种情况总结如下:
无论try里面有无return语句 finally里的语句都会执行,若try里面有return语句,finally里面没有,虽然在finally里面改变了返回变量的值,此时不予更新返回值的值。
若try和catch里面都有返回语句,系统执行返回finally里的返回语句。
回复 使用道具 举报
翁游龙 发表于 2012-7-3 17:05
如果是按你这么说先finally再return,而在finally语句块中已经是++1了,
但是结果为什么不是2呢?这里不 ...

应该是先return返回值为1,这时候就打印1了。然后再执行finally后x=2,因为这个没有return语句就不会返回Test(),可以说程序结束了,不会再打印
回复 使用道具 举报
我同意7楼的观点
回复 使用道具 举报
在这个程序里面,finally是可肯定会执行的语句,其次这个程序的执行顺序我加了断点执行了一下,
顺序是先执行try语句,在执行catch只不过catch的值没有返回,所以打印结果是1.
回复 使用道具 举报
翁游龙 发表于 2012-7-3 17:05
如果是按你这么说先finally再return,而在finally语句块中已经是++1了,
但是结果为什么不是2呢?这里不 ...

我理解错你的意思了。是先执行 return x,但因为有finally,所以它会先执行完finally 再把x return回去,而finally之前已经确定了要return的值是多少了。所以输出1.
回复 使用道具 举报
dev 中级黑马 2012-7-3 18:47:07
11#
葛奎 发表于 2012-7-3 16:58
finally语句会执行
你就记着是在return之后执行.但是分两种情况
1,当finally语句块里面没有return语句时候, ...

我试过在finally语句块中加上return x;确实可以得到结果为2,基本明白了这道题,谢谢你。
回复 使用道具 举报
dev 中级黑马 2012-7-3 18:48:28
12#
车风波 发表于 2012-7-3 18:35
我理解错你的意思了。是先执行 return x,但因为有finally,所以它会先执行完finally 再把x return回去,而 ...

嗯。你现在讲我也明白了。谢谢你的解释。
回复 使用道具 举报
加个输出语句就可以知道先执行谁了
  1. public class TestDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println(new TestDemo().test());
  6. }


  7. public int test(){
  8. int x = 1;
  9. try{
  10. return x;
  11. }finally{
  12. System.out.println(3);
  13. }
  14. }
  15. }
复制代码
打印结果是

这里是先执行finally语句的,所以先打印了3,再打印返回值。但这里是输出语句,如果是return的话,就会把finally里return的结果做为最终返回的结果,如果没有就把其它语句的返回值做为最终结果,如一楼所说,不过通常finally语句里都是用执行来释放资源的必须执行的语句
回复 使用道具 举报
在return后执行 之后finally还是会被执行
如果finally中没有return则返回之前的值,有的话就返回finally中的值
回复 使用道具 举报
翁游龙 发表于 2012-7-3 18:47
我试过在finally语句块中加上return x;确实可以得到结果为2,基本明白了这道题,谢谢你。 ...

呵呵 不客气  共同进步:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马