黑马程序员技术交流社区

标题: 关于return和finally [打印本页]

作者: 932759732    时间: 2013-4-19 14:18
标题: 关于return和finally
本帖最后由 杨玄文 于 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中的语句先执行呢

作者: 先小涛    时间: 2013-4-19 14:41
try语句块中的语句执行完后(自然结束),或者遇到return语句之前,会查看是否有finally语句块,若有,则执行finally中的语句;若无,则执行try中的return语句。而你的代码执行顺序是:先执行try语句块,而里面只有一条return语句,则检查有无finally语句块,有,则执行其中的语句return,此时,程序已经直接return了,所以没有执行到try中的return语句。说的啰嗦了,你看明白了没?
作者: vicoooo    时间: 2013-4-19 14:48
try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。
作者: vicoooo    时间: 2013-4-19 14:50
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语句后执行
作者: 932759732    时间: 2013-4-19 15:17
vicoooo 发表于 2013-4-19 14:50
public  class Test {

        /**

那为什么返回值是2,而不是1呢。finally不是无法改变返回值的吗
作者: yufeng47    时间: 2013-4-19 15:31
vicoooo 发表于 2013-4-19 14:48
try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行 ...

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

嗯,这道题是张老师总结的金典面试题,返回结果先进入函数栈,finally的返回值才是真正的返回值,其实自己动手做实验会了解的更透彻。
作者: 932759732    时间: 2013-4-19 22:20
非常感謝大家。知道了




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