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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨华东 中级黑马   /  2012-10-9 18:12  /  1543 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨华东 于 2012-10-9 18:26 编辑

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

  1. public class Test7
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println(new Test7().test());;
  6. }

  7. static int test()
  8. {
  9. int x = 1;
  10. try
  11. {
  12. return x;
  13. }
  14. finally
  15. {
  16. ++x;
  17. }
  18. }
  19. }
复制代码
运算结果是:1   
求大神解释!!!!!

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

8 个回复

正序浏览
本帖最后由 王震阳 于 2012-10-9 19:11 编辑
  1. //在这个例子中,我们可以看到尽管在finally前有return,但是finally()方法是一定会运行的。
  2. //代码System.out.println(new Test7().test());调用了test()方法时,获得了一个返回值x,此时x=1,至此该方法继续进行++x,此时x才等于2.
  3. public class Test7
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 System.out.println(new Test7().test());
  8.                 //下面两行代码和上面代码效果是一样的。
  9.                 int y=new Test7().test();//定义个变量用于存储test()方法的返回值,也就是获取return x,中的x的值。
  10.                 System.out.println(y);
  11.         }

  12.         static int test()
  13.         {
  14.                 int x = 1;
  15.                 try
  16.                 {
  17.                         return x;
  18.                 }
  19.                 finally
  20.                 {
  21.                         System.out.println("finally()方法正在运行。。。");
  22.                         ++x;
  23.                         System.out.println("x="+x);
  24.                 }
  25.         }
  26. }
复制代码
上面程序演示图如下:通过该程序和图就可以解决楼主的疑问。




return and finally.jpg (25.22 KB, 下载次数: 33)

return and finally.jpg

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
葬天 中级黑马 2012-10-9 19:07:46
8#
程序遇到return,throw这些关键字时,会去找有没有finally块,如果有先执行finally
然后在执行return,throw,但是finally里对返回的数据的修改不会产生影响
还有一种情况:
当finally 里也还有return时,程序执行完finally的return 就会终止 即使之前有return 也不会被执行了

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1.   static int test();
  2.      0  iconst_1
  3.      1  istore_0 [x]
  4.      2  iload_0 [x]
  5.      3  istore_2
  6.      4  iinc 0 1 [x]
  7.      7  iload_2
  8.      8  ireturn
复制代码
分析下这个字节码
执行return x;时是先把x的值存入变量2中,然后再执行的++x;
然后再返回的变量2的值,所以打印的是1而不是2

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
finally里面的代码是一定要执行的代码 不管有没有异常  即使有return也会执行  并且是在return前面执行
finally里面的代码只有一种情况不会被执行到  那就是在其前面有System.exit(0)
finally里面一般是放处理资源的代码  比如关闭数据库的

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
杨华东 发表于 2012-10-9 18:31
我是说  既然执行 为啥++x 还是1呢   不是现加后赋值吗??

因为他返回的是try里执行的x此时x=1啊!然后再执行的finally的
回复 使用道具 举报
test()方法的返回值是x在return执行时候的值,finally中虽然x的值变了,但是已经获取了方法的返回值,x变化后也没有用了。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Jordon 发表于 2012-10-9 18:28
finally 前面有return 可以被执行,但是前面有System.exit(0),就不能被执行了。System.exit(0)表示整个程 ...

我是说  既然执行 为啥++x 还是1呢   不是现加后赋值吗??
回复 使用道具 举报
finally 前面有return 可以被执行,但是前面有System.exit(0),就不能被执行了。System.exit(0)表示整个程序结束。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马