博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中try finally的疑问
阅读量:6085 次
发布时间:2019-06-20

本文共 1214 字,大约阅读时间需要 4 分钟。

hot3.png

先来道题:

public class Test {	public static void main(String[] args) {		String result = getString();		System.out.println(result);	}	static String getString(){		String s1 = "1";		try {			return s1;		} finally {			s1 = "3";		}	}}

也许大家都知道在try中return之前都会先执行finally语句,结果应该是 “3”,但是输出的结果却是1。很奇怪是吧,这种问题只能看JVM虚拟机规范才知道,但是查资料比较麻烦,只能通过jvm指令看看虚拟机是如何做的。

执行 javap -c Test

static java.lang.String getString();   Code:      0: ldc           #5                  // String 1      2: astore_0      3: aload_0      4: astore_1      5: ldc           #6                  // String 3      7: astore_0      8: aload_1      9: areturn     10: astore_2     11: ldc           #6                  // String 3     13: astore_0     14: aload_2     15: athrow   Exception table:      from    to  target type          3     5    10   any         10    11    10   any

其中0-2行是将 "1"字符串赋值给第一个变量 3-4行 将第一个引用变量放入栈顶,然后将栈顶元素存入第二个变量(这个变量是虚拟机中的局部变量) 5-7行 存入"3" 进字符串常量池并将其推至栈顶,然后将栈顶元素存入第一个变量(s1),此时s1的值被改变了。 8-9行 载入第二个变量至栈顶,由于第二个变量的值是1(这里第二个变量是3-4行中对第一个变量的一个拷贝,第一个变量改变了,但是第二个变量的值还是保留) 最后将栈顶的值return,所以最后结果是 "1"

总结: 在java中,try中return的值是其拷贝(并非本身),finally对其修改,不会影响return的值。

思考: 如果将String s1 改成对象,在finally中修改对象属性会如何?

转载于:https://my.oschina.net/aiheng1988/blog/526019

你可能感兴趣的文章
展望VR AR 2017,旅游、营销以及家装行业或许会火一把
查看>>
“九”答不可 | 如何设计量子计算机?科学家称其速度存在理论上限
查看>>
蓝凌副总裁夏敬华:智明当下,慧看未来——移动互联下企业知识管理应用趋势...
查看>>
Mac下的SSH插件(默认自带)
查看>>
安卓应用安全指南 4.6.3 处理文件 高级话题
查看>>
独家专访阿里高级技术专家北纬:Dubbo开源重启半年来的快意江湖
查看>>
黑科技时代,不了解这些你就OUT了
查看>>
机器视觉中评价光源质量的指标
查看>>
AI为移动医疗APP加码
查看>>
Webpack 入门教程一
查看>>
Keras上的VGGNet、ResNet、Inception与Xception
查看>>
关于python的bottle框架跨域请求报错问题的处理
查看>>
dirname() 函数
查看>>
Fms3中client端与server端交互方式汇总
查看>>
SVG系列一
查看>>
VS2005环境下的DLL应用
查看>>
windows终止处理程序( __try __finally) 简单解析
查看>>
Configuring Default-network for EIGRP
查看>>
Redis集群部署文档(centos6系统)
查看>>
部署docker-gitlab
查看>>