谁能给我我解释一下这段程序的结果为什么是:2.而不是:3

慕卿如梦 2015-03-28 09:10:24
class Test{
public int aaa(){
int x=1;

try{
return ++x;
}catch(Exception e){

}finally{
++x;
}
//System.out.println("atguigu");
return x;
}

public static void main(String[] args) {
Test t= new Test();
int y=t.aaa();
System.out.println(y);
}
}
...全文
936 24 打赏 收藏 举报
写回复
24 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
oyangfong 2015-04-08
11楼强,赞一个
  • 打赏
  • 举报
回复
gotopause 2015-04-08
楼上说的都很对我就不强调了
  • 打赏
  • 举报
回复
iversonfor2 2015-04-07
,,, - - 看走眼了,,,
  • 打赏
  • 举报
回复
iversonfor2 2015-04-07
因为finally遇到return的时候 会先执行finally,,,,后执行return,,,,,, 但是你的finally里面已经return过了,,所以try里面的return就不会执行了
  • 打赏
  • 举报
回复
zql421113710 2015-04-07
引用 11 楼 ZJL_foxfire 的回复:
楼主问 了个好问题啊。 居然楼主问了为什么是2不是3,那么可以肯定,楼主已经知道了finally语句会执行的。楼主的疑问主要是居然执行了finally,那么应该会返回3才对啊。那问什么会是2呢?其实这里涉及到jvm的细节~~ 看到很多人都赞成5楼的说法,我唯有怒站出来回答下,以免大家都抱着一个错误的说法。 先给一个最有说服力的答案:根据java官方教程的jvm规范里的一段话就可以知道为什么了:
引用
If the try clause executes a return, the compiled code does the following: 1.Saves the return value (if any) in a local variable. 2.Executes a jsr to the code for the finally clause. 3.Upon return from the finally clause, returns the value saved in the local variable.
要翻译?: 如果try语句里有return,那么代码的行为如下: 1.如果有返回值,就把返回值保存到 局部变量中 2.执行jsr指令跳到finally语句里执行 3.执行完finally语句后,返回之前保存在局部变量表里的值 根据上面的说明就可以轻易地解释为什么是2了。 当执行到return ++x;时,jvm在执行完++x后会在局部变量表里另外分配一个空间来保存当前x的值。 注意,现在还没把值返回给y,而是继续执行finally语句里的语句。等执行完后再把之前保存的值(是2不是x)返回给y。 所以就有了y是2不是3的情况。 其实这里还有一点要注意的是,如果你在finally里也用了return语句,比如return +xx。那么y会是3。因为规范规定了,当try和finally里都有return时,会忽略try的return,而使用finally的return。
解释的一般,因为最后你举例的时候,例子举得不错,但是你给的结果是错的。所以证明了:1你真的是疏忽了。2之前你给的答案也是临时抱佛脚,理解的也是一半一半。
  • 打赏
  • 举报
回复
zql421113710 2015-04-07
引用 5 楼 wzgl708937822 的回复:
综合一下:执行t.aaa()是,函数执行return ++x; 就将值返回给y(==2),由于x是局部变量,最后执行finally的++x也不会影响y的值;如果x是全局变量的话,y的值还是2,但此时x 的值变成3(与y无关),故关键代码还是return ++x 造成的
建议,回去多看看基本知识再来解答。谢谢。
  • 打赏
  • 举报
回复
笔墨桑 2015-04-03
我想问的问题是。。为啥去掉catch。第二个return就报错了呢
  • 打赏
  • 举报
回复
xingxiaobai 2015-04-03
把x换成引用类型的属性,例如++a.x,最后的返回值a.x的值就是3了
  • 打赏
  • 举报
回复
ZJL_foxfire 2015-04-01
友情回复~~ 如果还想要更详细的教程,请看我针对这个问题专门写的一篇博客 如果还不懂就用板子拍死我把~~~ 不过请记住今天是愚人节~~
  • 打赏
  • 举报
回复
小_柏 2015-04-01
11楼说的好
  • 打赏
  • 举报
回复
诺维茨基 2015-04-01
到第一个return时候整个函数都结束了,后面的return就没有执行了,结果当然是2 例如break终止循环的一样,return相当于函数的结束符,后面的内容就不会执行了
  • 打赏
  • 举报
回复
wangdong1031 2015-04-01
11楼模范回答
  • 打赏
  • 举报
回复
ZJL_foxfire 2015-03-31
楼主问 了个好问题啊。 居然楼主问了为什么是2不是3,那么可以肯定,楼主已经知道了finally语句会执行的。楼主的疑问主要是居然执行了finally,那么应该会返回3才对啊。那问什么会是2呢?其实这里涉及到jvm的细节~~ 看到很多人都赞成5楼的说法,我唯有怒站出来回答下,以免大家都抱着一个错误的说法。 先给一个最有说服力的答案:根据java官方教程的jvm规范里的一段话就可以知道为什么了:
引用
If the try clause executes a return, the compiled code does the following: 1.Saves the return value (if any) in a local variable. 2.Executes a jsr to the code for the finally clause. 3.Upon return from the finally clause, returns the value saved in the local variable.
要翻译?: 如果try语句里有return,那么代码的行为如下: 1.如果有返回值,就把返回值保存到 局部变量中 2.执行jsr指令跳到finally语句里执行 3.执行完finally语句后,返回之前保存在局部变量表里的值 根据上面的说明就可以轻易地解释为什么是2了。 当执行到return ++x;时,jvm在执行完++x后会在局部变量表里另外分配一个空间来保存当前x的值。 注意,现在还没把值返回给y,而是继续执行finally语句里的语句。等执行完后再把之前保存的值(是2不是x)返回给y。 所以就有了y是2不是3的情况。 其实这里还有一点要注意的是,如果你在finally里也用了return语句,比如return +xx。那么y会是3。因为规范规定了,当try和finally里都有return时,会忽略try的return,而使用finally的return。
  • 打赏
  • 举报
回复
leeKitty 2015-03-30
程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行try中return; 在try中 已经执行了return 只是等待finally中的代码执行 然后完成try中的代码 也就完成了return 所以结果为2
  • 打赏
  • 举报
回复
vipwhr 2015-03-30
因为try的时候已经return了,只能执行一个return 所以就只返回2 咯~
  • 打赏
  • 举报
回复
答案就在这篇博客中:解析Java finally
  • 打赏
  • 举报
回复
______S_cs 2015-03-28
额…答得不太好……建议你找本书看看
  • 打赏
  • 举报
回复
______S_cs 2015-03-28
这涉及到finally{}语句块中操作与try{}语句块中的return的执行顺序,这段代码先执行了return ++i; 返回了2之后再执行finally{}语句块
  • 打赏
  • 举报
回复
空空掌门 2015-03-28
学到了,谢谢提出
  • 打赏
  • 举报
回复
qq_26938357 2015-03-28
5楼解释的挺好,顶一个。 x实际上是3,只是在它是2的时候执行了return,所以y=2
  • 打赏
  • 举报
回复
加载更多回复(3)
相关推荐
发帖
Java SE

6.2w+

社区成员

Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
帖子事件
创建了帖子
2015-03-28 09:10
社区公告
暂无公告