憨厚生

----Java's Slave----
***Java's Host***

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  165 随笔 :: 17 文章 :: 90 评论 :: 0 Trackbacks
   在http://www.cnitblog.com/yemoo/archive/2008/06/18/45850.html文中巧用try finally;但是让我对finally执行过程有点疑惑,发现java的try catch功能和js是一样的。下面列出例子:
   public int test1(){
   int i=4;
   try{ return i;}finally{ i=0;System.out.println("---test----");}
}
   执行结果:输出---test----,test1方法返回4;我的疑惑是为什么不返回0
   在QQ群里讨论的时候,有人说finally中的语句在try中的return后执行。但是如下代码执行否决了上面的结论。
public int test2(){
   int i=4;
   try{ return i;}finally{ i=0;System.out.println("---test----");return i;}
}
   注意:在finally中多了个return i;
   执行结果:输出---test----,test2方法返回0;
   这个例说明了finally中的语句是在try的return执行前执行的。那么test1方法的finally中i=0了,但是为什么test1方法还返回4呢?这是我的疑惑,那位知道解释一下。

posted on 2009-04-01 11:54 二胡 阅读(2178) 评论(10)  编辑  收藏 所属分类: Java

评论

# re: try catch finally一点疑惑[未登录] 2009-04-01 12:20 jbahamut
return 压栈,执行finally,方法返回

第一个test中return压栈后,栈中的值没有变,所以返回4  回复  更多评论
  

# re: try catch finally一点疑惑 2009-04-01 13:12 sex
就是先把return后面的值保存起来了 执行finally之后 再返回  回复  更多评论
  

# re: try catch finally一点疑惑 2009-04-01 14:07 隔叶黄莺
finally 相当于一个小例程  回复  更多评论
  

# re: try catch finally一点疑惑 2009-04-01 14:07 JetMa
@jbahamut
正解  回复  更多评论
  

# re: try catch finally一点疑惑 2009-04-01 20:31 dennis
看字节码
  回复  更多评论
  

# re: try catch finally一点疑惑 2009-04-02 08:25 erhu
@jbahamut
哦,原来是这样的!  回复  更多评论
  

# re: try catch finally一点疑惑 2009-04-02 10:47 Fingki.li
finally块里尽量避免使用return,会吃掉exception.  回复  更多评论
  

# re: try catch finally一点疑惑[未登录] 2009-04-03 09:03 GreatGhoul
大开眼界呀.有这种用法.  回复  更多评论
  

# re: try catch finally一点疑惑 2009-04-05 14:02 shivaree
受教了。。。这些小概念都很奇特啊。  回复  更多评论
  

# re: try catch finally一点疑惑 2009-10-29 20:03 yonder
try catch finally是同一个方法,就是同一个栈里面,所以退栈来解释是错误的.这是因为return i;已经执行,已经把i的值拷贝一个临时变量,这个语句有好几个汇编语句组成的,所以仅仅是整个方法返回这一步执行之前,才去执行finally语句,在finally里面改变i的值,但是已经不能改变前面那个临时变量了.  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问