求大神们相助····

以太 2011-12-19 11:32:53
class text{
public static void main(String[] args) {
System.out.println(testt());
System.out.println(x);

}

static int x = 99;
public static int testt() {
try {
return x;
} catch (Exception e) {
} finally {
x = 8;

}
return x;
}
}
运行结果为:
99
8
按顺序执行为什么第二个为8?
...全文
170 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ404902181 2011-12-21
  • 打赏
  • 举报
回复
呵呵 看来我们要学习的还很多啊
come_on1314 2011-12-21
  • 打赏
  • 举报
回复
刚才又看了一下,貌似我的理解错了,是先return(复制副本)->finally->return(真正跳转),是这样的吗?啊,我晕了。。。。
come_on1314 2011-12-21
  • 打赏
  • 举报
回复
想问下楼上的大侠,在执行finally之前把x复制了一份,然后执行finally语句,再return,请问一下为什么这个return要返回这个副本呢?在复制和finally之间编译器又做了什么让return返回这个副本呢
SuzenIM 2011-12-20
  • 打赏
  • 举报
回复
具体的为什么return返回的是复制值就要考虑到变量的存储地址了!

基本类型和对象引用都存储在栈中,new出的的对象或数组存储在堆中。

改写上述代码为:
class text{
public static void main(String[] args) {
System.out.println(new text.testt()); //此为new对象放在堆中
System.out.println(x); //static int x = 99;

}
SuzenIM 2011-12-20
  • 打赏
  • 举报
回复
finally中没有return,返回的是try或catch里的return,此题是try中的return。但是如LZ所知finally在return前执行,为什么finally对返回值x的修改没有起到作用?因为方法在return的时候并不是把它拥有的那个值给返回了,而是把x复制了一份返回。
所以99是x在finally前的复制,8是finally操作后x所存储额定值!

总之:第一个返回的是x在finally前的复制值,第二个是直接返回的x
Loveandlove111 2011-12-20
  • 打赏
  • 举报
回复
finally最后执行,但有返回值的时候,是在finally执行后才会返回的,但99未发生变化,原因在于在执行finally之前return已经取到x的值99,并压入栈中,所以。。。(个人意见,猜想)
泥煤_ 2011-12-20
  • 打赏
  • 举报
回复
static与finally关系搞清楚了,就没什么困难了。
以太 2011-12-20
  • 打赏
  • 举报
回复
如果按一楼说法确实一切都解释了,可调试是显示finally先执行然后才有return,楼下有几位没搞明白,我知道finaly会执行,可按调试过程finally执行完后X已经改变,为什么return值没变?各位可以调试看看
ns891108 2011-12-20
  • 打赏
  • 举报
回复
x的作用域为整个main方法,而且你调用test()方法的时候finally一定会执行,所以 System.out.println(testt());执行完。x就已经等于8了
yuanyuan2134 2011-12-20
  • 打赏
  • 举报
回复
我也想知道答案
hao1314 2011-12-20
  • 打赏
  • 举报
回复
是因为return回去后,还继续执行finally 改变了x的值。
lianghuihaoKing 2011-12-19
  • 打赏
  • 举报
回复
我也想知道答案!!!
b092849 2011-12-19
  • 打赏
  • 举报
回复
嗯 看了下,确实
work_sunzh 2011-12-19
  • 打赏
  • 举报
回复
因为你调用testt方法时,finlly代码块一定会被执行,所以x值变为8了
chensuper 2011-12-19
  • 打赏
  • 举报
回复
finally永远在最后执行,包括return。
事情的背景是这样的,我自己的笔记本是联想G580,12年买的,比较老旧了,但没什么大毛病,前阵子发现开机会有嘀嘀嘀的声音,我在网上查了下,有说内存问题、硬盘问题、电源问题、主板问题的,我自己也把内存条拆了用酒精清理了,问题还是依旧。 这里有个细节,就是每次开机嘀嘀嘀后,都可以进入到输入密码的界面,然后密码输入框会自动输入很多内容,因为密码是看不到的,所以不知道是什么内容。删掉自动输入的密码后输入正确的密码是可以正常进入系统的,其它也没感觉也什么问题。 之前认识一个广州的修机师傅,也有他VX,就VX请教了他,把问题描述给他后,他之间说键盘有问题。 一开始问不信,然后自己想了想,感觉有道理,变简单测试了键盘,发现键盘上的逗号键上有问题,打不出逗号。后来,我想干脆把键盘拆了,开机试试,发现不会有嘀嘀嘀了,说明正是键盘的问题。 随后我果断下单买了一个原装的键盘,很快,第二天就到了,装上去后就没问题了。 这里我想写个小程序,用来测试键盘的按键情况,经过一下午的埋头苦敲,终于搞定! 软件的使用对象应该上那些键盘商家,用不上的亲别喷太水啦。。。 其中有几个按键的键代码获取不到,望有空的大神出手相助。。。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧