检验对finally理解是否透彻的一段代码
2013-04-28 15:23
429 查看
刚在在csdn看到一篇关于讨论finally试题的帖子:http://bbs.csdn.net/topics/390439078
程序代码:
刚开始看到的时候感觉很简单,后来把程序运行之后发现结果和自己想的的不一样,就仔细分析了一下!
运行结果:
1
1
3
分析结果:
程序代码:
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
相关文章推荐
- 检验对finally理解是否透彻的一段代码
- 软件测试(由软件工程检验一段代码是否正确想到的)
- try{}里有return语句,那么后面的finally{}里的代码是否会执行,什么时候被执行
- 根据一段代码理清一些变量,常量,数组,指针的关系及理解
- 一段有趣的js代码,让你对js的运行加载有深刻的理解
- 写一段代码判断一个单向链表中是否有环
- 用于理解vtkPolyData和vtkCellArray的一段代码
- java的try-catch-finally块中,finally中的代码是否一定会执行?
- 记录对一段js代码重构的理解
- try catch finally 的用法,你知道多少?最详细、最到位的讲解,配合代码实例讲解,让你轻松掌握和理解
- 一段检查IP地址段是否合法的代码
- 简单理解,当try中有return时finally是否会被执行,如何执行
- 一段测试网络是否连通的代码
- 如何检验离散变量是否相关样例和代码(Chi-square Test 切比雪夫检验)
- main 主函数执行完毕后,是否可能会再执行一段代码?
- 一段很好用的判断数据库中某张表是否存在的代码[转]
- C# 一段代码理解”委托“
- 块内像素循环的一段小代码理解
- 一段代码对C++的理解
- Golang 如何将一个函数作为另一个函数的输入值,清晰透彻的注释让你理解该如何阅读抽象的代码