黑马程序员技术交流社区

标题: 异常处理finally块的问题 [打印本页]

作者: panningwjr    时间: 2013-8-6 17:16
标题: 异常处理finally块的问题
本帖最后由 杨兴庭 于 2013-8-7 17:56 编辑

今天看到一题目说:异常处理时,catch块中执行return语句后还会执行finally块吗
我i也不知道答案,就写了段代码看了下结果

finally语句执行了,但是问题就在这,
平常说的是return还有break执行后会结束当前程序,为什么程序结束后还会执行finally块中的代码呢?
还是return语句执行后没有结束程序?

作者: wang100753    时间: 2013-8-6 17:39
finally 语句块是在 try 或者 catch 中的 return 语句之前执行的。更加一般的说法是,finally 语句块应该是在控制转移语句之前执行,控制转移语句除了 return 外,还有 break 和 continue。另外,throw 语句也属于控制转移语句。虽然 return、throw、break 和 continue 都是控制转移语句,但是它们之间是有区别的。其中 return 和 throw 把程序控制权转交给它们的调用者(invoker),而 break 和 continue 的控制权是在当前方法内转移。
作者: 夜空闪亮    时间: 2013-8-6 20:23
本帖最后由 夜空闪亮 于 2013-8-7 00:57 编辑

   在Java中当try、finally语句中包含return语句时,执行情况到底是怎样的,现在通过下面的例子加以说明:
                          第一种情况:try中包含return语句,finally中不包含(见图1):

                         第二种情况:try,finally中都包含return语句(见图2):
                            我们将上面的代码稍作改动


结论:1.无论try里边有没有return语句,finally里边的语句一定都会执行。
           2.如果finally里边没有return语句,try里边有return,那么会在确定返回值后再去执行finally中的代码,然后才将先前确定的返回值返回;如果finally里边也有return语句,此时finally中的返回值将会覆盖在try里边获取的返回值,所以最终将返回finally中的返回值。而在try------catch------finally语句中特殊的地方就在这里,遇见return语句后函数的执行并不会立即结束,除非用System.exit(0)强制退出程序,程序才会结束,否则就要等finally代码块执行完毕才会退出!


1.png (23.13 KB, 下载次数: 14)

1.png

2.png (20.4 KB, 下载次数: 9)

2.png

作者: 陈国柱    时间: 2013-8-6 21:19
只有一种情况,finally才不会执行,那就是在finally前面有“System.exit(0);” 其意思为JVM结束。

TestFinally.jpg (18.61 KB, 下载次数: 9)

TestFinally

TestFinally

作者: 645420297    时间: 2013-8-6 21:35
楼上说的对 只有使用“System.exit(0);” 时才不会执行finally,意外退出jvm ,而放在finally语句中的代码为必须要执行的语句,不管前面有什么他都要执行
作者: 黑马王晓明    时间: 2013-8-7 00:01
同意楼上两层的说法
不管是什么情况finally是一定会执行的
除了一中情况,那就是在finally前面有System.exit(0);
因为这句代码的意思是JVM结束工作退出了已经
所以可想而知下面的代码肯定都不会被执行到的
作者: panningwjr    时间: 2013-8-7 13:30
哦,了解,谢谢各位了,就是说不管try块中是否有return,break等语句,finally一定会执行,也就是说现在程序还没有停止,等finlly里面的代码运行完了程序才停止。只有一种情况System.exit(0),这是直接使程序停止运行了,所以finally里面的代码就不会执行了。是这样么?
作者: 任亚俊    时间: 2013-8-7 15:58
学习了,以前没考虑过这么基本的问题,都去学面向对象了(设计模式那块)。
作者: sunhaoz    时间: 2013-8-7 22:44
在try..catch..finally中 ,finally是无论如何都被执行的 除了在try 或者 catch 内 有System.exit(0); 或者 直接杀进程等才不会执行.
作者: 一只文字    时间: 2013-8-8 09:22
finally 语句块是在 try 或者 catch 中的 return 语句之前执行的, 如果return后面是个表达式的话 是先计算出表达式的结果 然后再执行语句finally 的




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