黑马程序员技术交流社区
标题:
try,finally的问题
[打印本页]
作者:
杨剑
时间:
2013-2-25 16:08
标题:
try,finally的问题
本帖最后由 杨剑 于 2013-3-18 12:58 编辑
public class Test2 {
public static void main(String[] args) {
System.out.println(test());
}
public static int test(){
int x = 1;
try {
return x;
}finally{
x++;
System.out.println(x);
}
}
}
为什么打印结果是2和1,不是1和2
作者:
王钊
时间:
2013-2-25 16:13
第一次打印肯定是finally中的x,因为x++变成2,所以打印2
第二次打印函数的返回值,是try中return返回的x,这里注意,虽然在return之前执行了finally并把x赋值为2,
但是return的内容在finally之前是已经确定好的,无论finally怎样改变x,return的x都为1
作者:
Gaara
时间:
2013-2-25 16:19
本帖最后由 张文彬 于 2013-2-25 16:21 编辑
因为当调用test()方法时,到return x;test方法并没有结束,
这个方法还没完,还要执行finally块(finally块中语句是必须执行的 )中的语句
而finally块中x++;
System.out.println(x);
所以就打印2了,然后test方法结束,因为return x;是在x=1时被返回的。所以返回1,
主函数中就执行打印1.。。。。。。。
作者:
贾文泽
时间:
2013-2-25 16:31
public class Test2 {
public static void main(String[] args) {
System.out.println(test()); //方法运行结束出栈才返回x
}
public static int test(){
int x = 1;
try {
return x;
}finally{ //程序在执行finally代码块时是把这段代码独立出来,并单独调用的, 所以先于方法调用得到的返回值打印
x++;
System.out.println(x);
}
}
}
复制代码
作者:
lzw123451
时间:
2013-2-25 22:16
前一段时间 参加公司的笔试问了这个问题,回来一查才知道当时自己做错了,百思不得其解,上网查到下面的程序,但是运行后发现了错误,我修改后放在了我的blog 上面,希望和大家分享。
经典的java中return和finally问题!
代码如下:
public class Test
{
public static void main(String[] args)
{
System.out.print(tt());
}
public static int tt()
{
int b = 23;
try
{
System.out.println("yes");
return b+=88;
}
catch(Exception e)
{
System.out.println("error : " + e);
}
finally
{
if(b>25)
{
System.out.println("b>25 : "+b);
}
System.out.println("finally");
}
return b;
}
}
复制代码
代码说明:
主要是用来测试return和finally语句到底哪个先执行.在try语句中,返回了b=111; 在finally语句中判断是否大于25,如果大的话就输出大..程序的结果是
yes
b>25 : 111
finally
111
也就是说明finally语句在return语句执行完了以后才执行的.
OK,那么问题来了,如果我把finally语句改成这样呢:
finally
{
if(b>25)
{
System.out.println("b>25 : "+b);
}
System.out.println("finally");
return 100;
}
也就是在finally中加入return 语句,返回不同的值. 那么,返回值到底是原来的b值(88),还是新的这个返回值呢? 废话不多,看结果:
yes
b>25 : 111
finally
100
这样又说明了一个问题,finally语句块里面的return把原来的return给覆盖了!!变成了新的返回值了.
OK,继续闷骚:我把代码改成这样:
try
{
System.out.println("yes");
return b;
}
catch(Exception e)
{
System.out.println("error : " + e);
}
finally
{
if(b>25)
{
System.out.println("b>25 : "+b);
}
System.out.println("finally");
b=100;
}
也就是把 try中的返回语句改成返回b值,然后在finally中改变b的值. 那么返回结果到底是原来的b值呢, 还是更改过的b值呢?结果如下:
yes
finally
23
说明了一个问题,如果finally语句中没有返回语句覆盖的话,那么原来的返回值就不会变,不管你是不是改变了要返回的那个变量.
最后还是来说说一点点想法,这个机制是不是这样的呢?碰到try语句中的return,那么先把return的值放在某个池中(怎么我也说起池来了,明明根本还不懂的)? 然后执行finally里面的代码块,如果有返回值覆盖语句,就改变先前放在池中的那个值,如果没有,就把那个池中的东西取出来返回出去
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2