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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© panningwjr 中级黑马   /  2013-8-6 17:16  /  1933 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-8-7 17:56 编辑

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

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

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

9 个回复

倒序浏览
finally 语句块是在 try 或者 catch 中的 return 语句之前执行的。更加一般的说法是,finally 语句块应该是在控制转移语句之前执行,控制转移语句除了 return 外,还有 break 和 continue。另外,throw 语句也属于控制转移语句。虽然 return、throw、break 和 continue 都是控制转移语句,但是它们之间是有区别的。其中 return 和 throw 把程序控制权转交给它们的调用者(invoker),而 break 和 continue 的控制权是在当前方法内转移。
回复 使用道具 举报
本帖最后由 夜空闪亮 于 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, 下载次数: 9)

1.png

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

2.png

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
只有一种情况,finally才不会执行,那就是在finally前面有“System.exit(0);” 其意思为JVM结束。

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

TestFinally

TestFinally

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
楼上说的对 只有使用“System.exit(0);” 时才不会执行finally,意外退出jvm ,而放在finally语句中的代码为必须要执行的语句,不管前面有什么他都要执行
回复 使用道具 举报
同意楼上两层的说法
不管是什么情况finally是一定会执行的
除了一中情况,那就是在finally前面有System.exit(0);
因为这句代码的意思是JVM结束工作退出了已经
所以可想而知下面的代码肯定都不会被执行到的
回复 使用道具 举报
哦,了解,谢谢各位了,就是说不管try块中是否有return,break等语句,finally一定会执行,也就是说现在程序还没有停止,等finlly里面的代码运行完了程序才停止。只有一种情况System.exit(0),这是直接使程序停止运行了,所以finally里面的代码就不会执行了。是这样么?
回复 使用道具 举报
学习了,以前没考虑过这么基本的问题,都去学面向对象了(设计模式那块)。
回复 使用道具 举报
在try..catch..finally中 ,finally是无论如何都被执行的 除了在try 或者 catch 内 有System.exit(0); 或者 直接杀进程等才不会执行.
回复 使用道具 举报
finally 语句块是在 try 或者 catch 中的 return 语句之前执行的, 如果return后面是个表达式的话 是先计算出表达式的结果 然后再执行语句finally 的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马