无聊小知识.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以及基础不够扎实的缘故。这里我也检讨一下。还是要学会看字节码的习惯,这里字节码是不会骗人的。

相关文章
|
10月前
令人头疼的数据输入,认识数据 输入输出
令人头疼的数据输入,认识数据 输入输出
119 0
|
11月前
|
程序员
什么是好代码/坏代码?给普通人的图解示例
什么是好代码/坏代码?给普通人的图解示例
80 0
|
11月前
|
C语言
C真的不难学,不信就看下我关于循环的理解
C真的不难学,不信就看下我关于循环的理解
|
12月前
|
开发者
试着做点儿有趣的事情
一个游戏怎样才算是做完了?这是个因人而异的问题。有些游戏还没有做出来就做完了,因为开发者不想再做了。有的游戏看上去做完了,但是后续还在不停的更新,那我们就说这个游戏其实还没有做完。至于如何算是做完了,我觉得这应该交由该游戏的制作者来决定。
55 0
【perl】老司机的再一次翻车:没有想到加了一句打印,会影响结果输出
【perl】老司机的再一次翻车:没有想到加了一句打印,会影响结果输出
|
前端开发 JavaScript
前端工作总结231-读懂每行代码
前端工作总结231-读懂每行代码
65 0
前端工作总结231-读懂每行代码
|
Python
又烧脑又炫技还没什么用,在代码里面打印自身
又烧脑又炫技还没什么用,在代码里面打印自身
162 0
又烧脑又炫技还没什么用,在代码里面打印自身
程序人生 - 猫咪为啥有“白袜子”
程序人生 - 猫咪为啥有“白袜子”
259 0
|
Java 程序员 Linux
Python仅用3行代码就能输出花式字符串图集,同事直呼666!
相信Java程序员看到上面的图,一定不会陌生。没错,springboot的启动日志。不知道其他人怎么想,我第一次看到这个启动日志的时候,就觉得好炫酷。然而,大家在日常的Python开发中,日志打印的却枯燥无比。今天就来教大家打印出让同事羡慕,却让领导崩溃的代码输出。
365 0
|
编译器
为何代码没错,却出不来结果,你可能...
为何代码没错,却出不来结果,你可能...
111 0
为何代码没错,却出不来结果,你可能...