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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

932759732

中级黑马

  • 黑马币:0

  • 帖子:61

  • 精华:0

© 932759732 中级黑马   /  2013-4-19 14:18  /  1652 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨玄文 于 2013-4-19 22:17 编辑
  1. public static void main(String[] args){
  2.                 System.out.println(getValue());
  3.         }
  4.         
  5.          public static int getValue() {
  6.                 int i1 = 1;
  7.                 int i2 = 2;
  8.                 try {
  9.                     return i1;
  10.                 } finally {
  11.                     return i2;
  12.                 }
  13.             }
复制代码
打印结果是2.我是这样理解的
finally中的return是比try中的return先执行
然后已经有了一个返回值,所以i1就没有被返回。

但是finally只是一定会执行的语句,为什么会比try中的语句先执行呢

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

7 个回复

倒序浏览
try语句块中的语句执行完后(自然结束),或者遇到return语句之前,会查看是否有finally语句块,若有,则执行finally中的语句;若无,则执行try中的return语句。而你的代码执行顺序是:先执行try语句块,而里面只有一条return语句,则检查有无finally语句块,有,则执行其中的语句return,此时,程序已经直接return了,所以没有执行到try中的return语句。说的啰嗦了,你看明白了没?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。
回复 使用道具 举报
public  class Test {

        /**
         * @param args add by zxx ,Dec 9, 2008
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println(new Test().test());;
        }

        int test()
        {
                try
                {
                        return func1();
                }
                finally
                {
                        return func2();
                }
        }
       
        int func1()
        {
                System.out.println("func1");
                return 1;
        }
        int func2()
        {
                System.out.println("func2");
                return 2;
        }       
}
-----------执行结果-----------------

func1
func2
2

结论:finally中的代码比return 和break语句后执行

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
vicoooo 发表于 2013-4-19 14:50
public  class Test {

        /**

那为什么返回值是2,而不是1呢。finally不是无法改变返回值的吗
回复 使用道具 举报
vicoooo 发表于 2013-4-19 14:48
try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行 ...

其实这个问题在张老师的java面试宝典中有详细解答,而且是2道题。记住,return语句返回并不是马上就把值返回给,而是将返回值放置在函数栈中,所以后面的return值将原先的return值覆盖了,一个方法只能返回一个值,不会返回多个值,否则JVM都将崩溃,那就不要说人了。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
yufeng47 发表于 2013-4-19 15:31
其实这个问题在张老师的java面试宝典中有详细解答,而且是2道题。记住,return语句返回并不是马上就把值 ...

嗯,这道题是张老师总结的金典面试题,返回结果先进入函数栈,finally的返回值才是真正的返回值,其实自己动手做实验会了解的更透彻。
回复 使用道具 举报
非常感謝大家。知道了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马