黑马程序员技术交流社区
标题:
关于try,finally的一点小问题,求高手
[打印本页]
作者:
一碗小米周
时间:
2013-12-28 21:15
标题:
关于try,finally的一点小问题,求高手
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呢?求解。谢谢。
作者:
杨道红
时间:
2013-12-28 21:50
本帖最后由 杨道红 于 2013-12-28 21:54 编辑
看错了。。finally 没有return
作者:
欢欢
时间:
2013-12-28 21:59
打印的是try代码块返回的1,
finnally里面只是对变量进行运算,却没有返回值
所以打印结果为1。
作者:
潘金锋
时间:
2013-12-28 22:01
return 为返回语句,返回的时候x值为1, finally语句虽然最终要执行,但在finally执行的时候1作为x的值已经返回给调用者了,然后局部变量x再自增,对返回值没有影响。
作者:
hurryup
时间:
2013-12-28 22:17
对程序修改了一下可以得到你想要的结果了:
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(Test.test());
}
static int test()
{
int x=1 ;
try
{
return x;
}
finally
{
return ++x; //改为这句就自增了
// System.out.println("----"+x+"----");
}
}
}
复制代码
作者:
刘少来
时间:
2013-12-28 22:57
try中return了x,finally中只是对x就行了自增运算,打印结果x的值为try中return时x的值,所以是1
作者:
DOOR
时间:
2013-12-28 23:17
关于这个问题也曾让我纠结过好久,这个属于边缘性问题,有很多种说法,不太适合过于钻牛角尖。
你可以利用反编译软件,跟踪虚拟机的具体执行过程,我下面理论上帮你描述一下。
根据java规范:在try-catch-finally中,如果try-finally或者catch-finally中都有return,则两个return语句都执行并且最终
返回到调用者那里的是finally中return的值;而如果finally中没有return,则理所当然的返回的是try或者catch中return的值,但是 finally中的代码是必须要执行的。
主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。
下面是我写的代码,你做参考
public class FinallyTest
{
public static void main(String[] args) {
System.out.println(test());
}
static int test()
{
int x = 1;
try
{
return x=x+3;//执行return语句,返回结果已经准备好,并且被临时存储
}
finally
{
x=x+2;//finally中对变量x进行了改变,但是不会影响到return返回结果。
System.out.println(x);
System.out.println("finally执行"); //执行完finally之后,取出临时存储的值返回
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2