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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李道福 中级黑马   /  2013-9-9 20:03  /  953 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李道福 于 2013-9-9 21:20 编辑
  1. <p>public class Finally{
  2.         public static void main(String[] args){
  3.                 System.out.println(test());
  4.         }
  5.         public static String test(){  
  6.      try{  
  7.                         System.out .println("try block");  
  8.                         return test1 ();  
  9.                 } finally {  
  10.                         System.out .println("finally block");  
  11.          }  
  12.         }  
  13. public static String test1(){  
  14.                 System.out .println("return statement");  
  15.                 return "after return";  
  16.         }
  17. }</p><p>越看越糊涂了,刚看到一个资料说finally语句中的代码会在return语句之前执行,但这个程序的执行结果却是</p><p>try block
  18. return statement
  19. finally block
  20. after return</p><p>如果finally在return语句之前执行,那结果应该是</p><p>try block</p><p>finally block
  21. return statement
  22. after return</p><p>如果是在return之后执行,那结果应该是</p><p>try block
  23. return statement
  24. after return</p><p>finally block</p><p>有那位大神知道这是怎么回事嘛?finally到底是在什么时候才会执行?</p>
复制代码

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

2 个回复

倒序浏览
我以前好像回答过类似的问题但是帖子找不到了,再说一下
通常读到return的时候:1.先运算return之后的表达式取得要返回的值(你这里是test1 ()) 2.结束所在的函数并把值返回调用处。
finally语句实际是在1和2之间执行的,return语句会先运算return之后的表达式,取得要返回的值。把这个值先临时保存,然后去调用finally里的语句。等finally执行完了,才会结束整个函数并把临时保存的值返回调用处。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
首先要明确两点:
1、return 语句并不是立即返回,它本质上将设置返回结果和执行返回过程是分开处理的:首先它做了一个动作,将待返回的数据存入返回变量中。
2、如果在try catch语句中,try中有return语句,则finally块中的语句先于return语句(这里指的是设置返回结果)执行。
运行到return test1 ()时,会执行test1()里面的两条语句,第一条是打印"return statement",第二条语句是 return "after return"执行完之后,会把"after return"储存起来并不立即返回,而是执行finally语句打印"finally block",然后执行return语句把"after return"语句返回并打印出来!

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

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