黑马程序员技术交流社区
标题:
帮我看看这个题为什么是这样的
[打印本页]
作者:
朱皓
时间:
2012-3-1 10:11
标题:
帮我看看这个题为什么是这样的
try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果:
public class Test {
/**
* @param args add by zxx ,Dec 9, 2008
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new Test().test());;
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;
}
}
}
---------执行结果 ---------
1
运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。
这个答案我还是不明白,能不能更详细一些的答案
作者:
冯兵兵
时间:
2012-3-1 10:17
return 语句后面的finally语句不会被执行,所以结果是1.因为return表示程序结束了
作者:
王国华
时间:
2012-3-1 11:20
return 表示从被调函数返回到主调函数继续执行,返回时附带一个返回值,此时已跳出程序,后面的语句也就不执行了,
作者:
李成航
时间:
2012-3-1 13:25
++x;//是可到达的语句,finally语句会被执行,因为finally表示最终一定执行里面块的内容
return x;//在这表示只跳出try块里的内容,不执行try快中return下面的语句,但跳出后依然会执行finally块的内容
程序之所以结果为1,是因为在每次执行的时候都会对x初始化为1然后返回(实际上每执行一次,finally的++x都会让他变为2,第二次调用又被初始化为1了)。
作者:
段玉超
时间:
2012-3-1 15:11
根据《JVM Specification 3.0》的4.9.6节,在try中的return真正返回之前,会将false保存到一个临时变量(假设为var)中,然后执行finally,在执行finally子句的任何语句之前,会将var中的值取出,如果finally中没有抛出异常或return、break、continue等语句,则在finally执行完后返回var(相当于返回去完成try中return的执行),如果finally中有return,var值会被覆盖,返回结果是finllay子句中return的值,如果是异常或break、continue等则执行相应的操作而不是返回。更详细解释参考JVM规范或《深入理解JAVA虚拟机(第二版)》。
作者:
欧阳博
时间:
2012-3-1 15:21
这个finally一定会执行的,不管try里面有没有return,但是是先执行try{}这一块的,接着看catch到了异常没,再走finally,你在try{}这里面return返回了X值,那肯定上面输出的是这个当前值啊。
作者:
黄秋
时间:
2012-3-1 17:00
LZ的东西,是来自就业面试宝典吧,把题目下面的“42、下面的程序代码输出的结果是多少?”也认真看看。既然宝典提到“在return中间执行”,就没那么简单。见下面代码:
public class Test {
public static void main(String[] args) {
System.out.println(new Test().test());
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
System.out.println(x);
++x;
System.out.println(x);
}
}
}
复制代码
结果是“1 2 1”,可见finally语句不但执行,x的值也改变了,但最后main打印的是“1”,原因如楼上有人说到的:
1. try中的return返回之前,会将返回值保存到一个临时变量,
2. 然后执行finally,若finally中有return,返回结果是finllay中return的值,
3. 若finally中无return,返回之前保存的临时变量。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2