黑马程序员技术交流社区

标题: finally问题 [打印本页]

作者: 李道福    时间: 2013-9-9 20:03
标题: finally问题
本帖最后由 李道福 于 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>
复制代码

作者: yangjie    时间: 2013-9-9 20:22
我以前好像回答过类似的问题但是帖子找不到了,再说一下
通常读到return的时候:1.先运算return之后的表达式取得要返回的值(你这里是test1 ()) 2.结束所在的函数并把值返回调用处。
finally语句实际是在1和2之间执行的,return语句会先运算return之后的表达式,取得要返回的值。把这个值先临时保存,然后去调用finally里的语句。等finally执行完了,才会结束整个函数并把临时保存的值返回调用处。
作者: 昝文萌    时间: 2013-9-9 20:26
首先要明确两点:
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"语句返回并打印出来!




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