无聊小知识.04 以下代码会输出什么?

简介: 今天同事给我看了一段代码,然后这段简单的代码,我却陷入了沉思。

1、前言

今天同事给我看了一段代码,然后这段简单的代码,我却陷入了沉思。

2、代码

String string = "";
try {
    string = "123";
    return string;
} finally {
    string = "234";
}

image.gif

这段代码,string最终是“123”还是“234”呢?按照以往认知:finally快是如论如何都要执行的,而return会等待finally执行结束后返回,这里string被修改为"234",那么return的值也就是"234"。

如果你也是这么想的,那么恭喜你,你也错了。

我们来看下chatGPT怎么说的:

image.png

正如chatGPT所说的,确实如此。这里吐槽以下,文某某言返回的居然是“234”???

我们用IDEA执行下这段代码:

image.png

甚至我们可以看到,idea在finally里面的赋值给出了提示。 提示该string的赋值是不会被使用的。

image.png而执行结果也正是123。

image.png

那么既然结果如此,那么真相是什么呢?

3、return和finally

其实finally始终都会执行是没错的!!! 我们先来看下该方法的字节码:

image.png

我们可以看到当执行到return时,此时string=123,jvm会将此时的变量地址存储到栈中,当finally执行了string=234后,只是改变了堆对象的值,而方法返回的该变量的地址。此时finally虽然改变了值,但是地址没有被改变,因此返回的还是原地址所执行的值。

4、改变一下

String string = "";
        try {
            string = "123";
            return string;
        } finally {
            string = "234";
            return string;
        }

image.gif

那如果是这段呢?finally中也加了return。我们再来看下字节码:

image.png

与上面不同的是,这里多了个areturn,也就是是这里的finally最终的返回会将该变量的地址推到栈顶位置,也就改变了原string=123的值,所以string就会输出234了。

image.png

5、小结

好了,又一个无聊又有趣的小知识。如果这个会出错的,大多还是对于jvm以及基础不够扎实的缘故。这里我也检讨一下。还是要学会看字节码的习惯,这里字节码是不会骗人的。

相关文章
|
C# 图形学 Windows
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
两行代码就能实现Form窗体的(背景)透明效果,它不是Opacity属性的整个窗体透明,`TransparencyKey`实现窗体的透明、窗体中间部分镂空效果...
4442 0
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
|
11月前
|
算法
基于爬山法MPPT最大功率跟踪算法的光伏发电系统simulink建模与仿真
本课题基于爬山法MPPT算法,对光伏发电系统进行Simulink建模与仿真。使用MATLAB2022a版本,通过调整光伏电池的工作状态以实现最大功率输出。爬山法通过逐步优化工作点,确保光伏系统在不同条件下均能接近最大功率点。仿真结果显示该方法的有效性,验证了模型的正确性和可行性。
|
机器学习/深度学习 人工智能 网络协议
人工智能平台PAI 操作报错合集之在本地运行Alink Server时没有遇到问题。但是,当您尝试在PAI上运行时出现了错误。如何解决
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
自然语言处理 安全 Java
java中如何实现多语言切换
java中如何实现多语言切换
811 2
|
存储 自然语言处理 Java
如何在Java中实现国际化与本地化
如何在Java中实现国际化与本地化
|
Ubuntu Linux 芯片
Linux(2)ubuntu rootfs根文件系统制作
Linux(2)ubuntu rootfs根文件系统制作
1063 0
|
存储 API C语言
C语言Log工具推荐-easylogger
C语言Log工具推荐-easylogger
479 1
|
存储 开发框架 JSON
uni-app 73聊天类封装(八)-添加聊天记录,在移动应用开发中,聊
uni-app是跨平台移动应用开发框架,简化了聊天功能的实现。开发聊天应用涉及数据存储(如IndexedDB、SQLite、云服务)、数据结构设计、消息发送(WebSocket或HTTP接口)、消息接收与展示(组件化开发,如`<view>`、`<scroll-view>`)及消息保存。通过uni-app的组件和插件,开发者能高效实现聊天记录的完整流程。[Read more](http://colorsound.cn/post/173.html?093671)
398 0
|
缓存 开发工具 数据安全/隐私保护
git-学习git,这一篇就足够了(初学者视角实战教程)
git-学习git,这一篇就足够了(初学者视角实战教程)
456 0
|
Arthas Java 测试技术
将线程死锁检测集成进arthas以提高定位效率
将线程死锁检测集成进arthas以提高定位效率
824 0