您的位置:首页 > 编程语言

检验对finally理解是否透彻的一段代码

2013-04-28 15:23 429 查看
刚在在csdn看到一篇关于讨论finally试题的帖子:http://bbs.csdn.net/topics/390439078

程序代码:

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);
}
}


刚开始看到的时候感觉很简单,后来把程序运行之后发现结果和自己想的的不一样,就仔细分析了一下!

运行结果:

1
1
3

分析结果:

1、int x = new Test().inc();
调用inc()方法,定义int x,在try对x赋值为1,然后return x!虽然finally中对x重新赋值,但是此时对inc()返回值没有影响!所以返回1
其中需要注意的两点时:x值已经改变,只是先return了,再改变x的值而已,所以只是对方法的返回值没有影响而已!
假如在finally中也有return,那么此时返回的值为3.

2、StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);

调用inc(x1)方法,在try中相当于x1.append("1");
此时x1 = new StringBuffer(); 相当于x1 指向新的内存地址可以看做为:x1 = xx2 = new StringBuffer()
然后 return xx2;
在finally中xx2.append("3");xx2 = xxx3 = new StringBuffer("4");

所以new Test().inc(x1)返回的引用地址是xx2,指向的内存空间是xx2.append("3")
x1的地址没变,指向的内存空间是x1.append("1");

只要弄清楚了,哪些是对引用的修改,哪些是对内存空间的修改就很容易弄明白了!

最终结果为:1,1,3


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: