日期:2014-05-20  浏览次数:20653 次

检验大家的finally学的程度的一段代码,你能全部答对吗?
本帖最后由 qq548573025 于 2013-04-25 17:36:25 编辑
大家看看会输出什么吧
我是第一个就错了,才写了第二个方法娱乐一下

package test;

public class Test {

public int inc() {
int x;
try {
x = 1;
return x;
} catch (Exception e) {
x = 2;
return x;
} finally {
x = 3;
}
}

public StringBuffer inc(StringBuffer x) {
try {
x.append("1");
x = new StringBuffer();
return x;
} catch (Exception e) {
x.append("2");
return x;
} finally {
x.append("3");
x = new StringBuffer("4");
}
}

public static void main(String[] args) {
int x = new Test().inc();
System.out.println(x);
StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);
System.out.println(x1);
System.out.println(x2);
}
}

异常 参数 Java

------解决方案--------------------
引用:
本帖最后由 qq548573025 于 2013-04-25 17:36:25 编辑
            大家看看会输出什么吧
我是第一个就错了,才写了第二个方法娱乐一下
Java code?123456789101112131415161718192021222324252627282930313233343536373839package test; ……

目测是
1
1
3

------解决方案--------------------
        System.out.println(x);//输出1,因为方法返回的是1,虽然finally会被执行
        StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);
       
         //输出1,传递的是一个对象的“复本”修改的是对象指向的内容
          System.out.println(x1);
         //输出3,finally怎样都会执行,因为其修改了地址里面的内容       
        System.out.println(x2);
------解决方案--------------------
答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1.
但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢


------解决方案--------------------
引用:
答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1.
但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢

这种问题,只要想明白修改的是什么就ok了
修改的是内存地址,还是地址里面的内容
------解决方案--------------------