黑马程序员技术交流社区
标题:
关于异常的问题
[打印本页]
作者:
黄树人
时间:
2012-9-22 19:16
标题:
关于异常的问题
本帖最后由 黄树人 于 2012-9-22 19:55 编辑
package haha;
public class VariantTest {
public static void main(String[] args) {
System.out.println(new VariantTest().test());
;
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;
}
}
}
复制代码
程序的输出结果为1,在异常中finally中的代码是一定会被执行的,我觉得输出结果应该是2
可是上面的程序,主方法调用了test方法,test是个异常处理方法
当执行完try语句后就直接把值返回了,可以认为是没有执行finally语句吗?
作者:
宁振庄
时间:
2012-9-22 19:27
网上高人解释:JVM解析的时候先将return回的值存在一个临时的空间中,然后执行finally,方法结束的时候再把原先临时空间的值取出来。
package haha;
public class VariantTest {
public static void main(String[] args) {
System.out.println(new VariantTest().test());
;
}
static int test()
{
int x = 1;
try
{
return x; //这一步将x的值,也就是1放到某个临时空间中
}
finally
{
++x; //这一步还是会执行的,这时候x值为2
}
}//方法结束的时候从原先临时空间把值取出来,所以x的值又变回了1
}
复制代码
作者:
梁志冰
时间:
2012-9-22 19:42
class VariantTest {
public static void main(String[] args) {
System.out.println
("main...."+
new VariantTest().test());
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;
System.out.println("finally....."+x);
}
}
}
运行结果:
finally.....2
main....1
将小程序进行如上的小改动,在finally中添加小小的打印程序,我们就可以从输出结果中清晰的看到,其实finally语句已经执行了,而且在主函数的println语句前执行。
在调用test()方法的时候,返回了x的值给主函数。而finally中的++x,是在对象中的x自增1,并没有返回给主函数,所以主函数输出的结果为1(即try中return的x值)
作者:
陈琦
时间:
2012-9-22 23:32
受教了,一直不明白这个问题
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2