黑马程序员技术交流社区

标题: return 和finally 为什么先输出的是 finally 而不是return后面的i [打印本页]

作者: 杜正冬    时间: 2012-11-19 20:31
标题: return 和finally 为什么先输出的是 finally 而不是return后面的i
public static void main(String[] args) {
                System.out.println(new Test8().returnTest());
        }

        public int returnTest() {
                int i = 2;
                try {
                        System.out.println("遇到return后面语句块不被执行 跳出try执行finally");
                        return i;
                }

                finally {
                        System.out.println("先执行了" + ++i);
                }
       
作者: 殷士剑    时间: 2012-11-19 21:01
你的问题是:
当try 中有 return 语句,程序会不会跳出 try...finally 语句。

从这个例子中不难看出,try...finally这种语句,不管怎样最终都是会执行到finally 的。

作者: 杜正冬    时间: 2012-11-19 21:12
为什么先执行finally 然后才输出return后i的值
作者: 坚持远方    时间: 2012-11-19 21:50

你的运行结果是:遇到return后面语句块不被执行 跳出try执行finally
先执行了3
确实是先执行的try,然后就返回了i的值,被finally里面的打印语句记录并打印出来了,我想你是把return的功能搞错了,他是返回值,可是并不能出现什么效果
作者: 金鑫    时间: 2012-11-19 22:39
public int returnTest()
        {
                int i = 2;
                try
                {
                        System.out.println("遇到return后面语句块不被执行 跳出try执行finally");
                        System.out.println("i="+i);//这里的i = 2;
                        return i;
                }

                finally
                {
                        System.out.println("先执行了" + ++i);
                }

        }


我在你的代码里return的前面加了一句话输出i的值,打印的结果是:

遇到return后面语句块不被执行 跳出try执行finally
i=2
先执行了3

也就是说try{}代码块中return i所返回的i值是2
在try{}finally{}代码块中,finally{}中的代码一定会执行。

我还是没看懂你的疑问是什么?

作者: 金鑫    时间: 2012-11-19 22:44
再补充一点,return的功能是将值返回并结束当前代码块。无论你的代码块是函数,switch语句等等,return都会结束当前代码块,你在return的后面加任意一句代码都会报错:无法访问的语句或者是不可达到的代码等等,反正都是一个意思访问不到。因为return已经将当前代码块结束了。
作者: 张硕    时间: 2012-11-19 22:57
finally关键字后面的语句是一定会被执行的,如果没有抛出异常,那么按照程序的执行顺序执行,如果在try块中抛出异常的话,在return语句执行之后返回程序之前,会去执行finally中的语句,当里面的语句执行完了,才会让return语句返回结果。

QQ截图20121119224917.png (5.38 KB, 下载次数: 143)

QQ截图20121119224917.png

作者: 李刚    时间: 2012-11-20 11:38
try中的 return语句调用的函数先于finally 中调用的函数执行,也就是说 return语句先执行,finally
语句后执行,所以返回的是finally结果 。 return并不是让函数马上返回,而是return 语
句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally 语
句后才真正开始返回。




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