检验对finally理解是否透彻的一段代码
来源:互联网 发布:mac pro 快速回到桌面 编辑:程序博客网 时间:2024/05/29 12:55
刚在在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
- 检验对finally理解是否透彻的一段代码
- 一段代码对C++的理解
- 一段理解nio的代码
- 对IP首部检验和的理解
- 对IP首部检验和的理解
- 对IP首部检验和的理解
- 关于try catch finally的一段测试代码
- finally之后的代码是否执行
- 一段测试网络是否连通的代码
- 对javascript匿名函数的理解(透彻版)
- 对javascript匿名函数的理解(透彻版)javascript
- 对javascript匿名函数的理解(透彻版)
- 对javascript匿名函数的理解(透彻版)
- 对javascript匿名函数的理解(透彻版)
- 对JAVASCRIPT匿名函数的理解(透彻版)
- 对javascript匿名函数的理解(透彻版)
- 对javascript匿名函数的理解(透彻版)
- 对JAVASCRIPT匿名函数的理解(透彻版)
- 利用批处理文件运行java程序
- JDBC数据库连接池的实现
- 使用c3p0开源的JDBC连接池小实例
- JDK自带的JVM性能监控工具jconsole的使用
- UML各种图例及相关元素的说明
- 检验对finally理解是否透彻的一段代码
- JFreeChart图形开发包学习笔记
- 在tomcat下context.xml中配置各种数据库连接池(转)
- sql server 附加数据库和还原数据库
- 在java项目中引入dll文件
- 使用IniEditor读写INI类型配置文件
- IniEditor笔记详解
- Ant 学习笔记
- Ant配置文件详解