return和finally究竟谁先执行,还有return是怎么返回数据的

Posted zhp-study-share

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了return和finally究竟谁先执行,还有return是怎么返回数据的相关的知识,希望对你有一定的参考价值。

今天突然有见到一个关于return和finally谁先执行的问题,有点疑惑就上网上查了查并写代码验证了一下。

先看如下图的代码执行结果:

技术图片

 

技术图片

 

 在此处证明了finally代码块并没有因为return语句的执行结束当前方法,从而没有执行finally语句,侧面的说明了一个问题就是finally代码块是一定会执行的。

然后有一个问题就是finally代码块执行了,里面给变量a赋值为20,但是输出的结果却是10,这又是为什么呢?

 

 然后这里就需要下一段代码来说明这个问题了,这里其实牵涉到一个方法的返回值是怎么返回给调用者的。

请看如下代码:

技术图片

 

 技术图片

 

 看着个最终的执行结果,我们可以得出同样的的结论就是代码即使执行了return语句,但是finally代码块肯定还是会执行的,那么就是刚提出的问题,上班第一段代码中finally代码块执行了,但是为啥a的结果是10,却没有变成20,原因是变量a是一个基本类型变量,所以能呢,对基本类型变量的赋值,是值传递,在调用test方法是,因为这个方法有返回值,所以在内存中会在方法钱预留一块内存空间用来放返回值变量,所以第一段代码里存储的是值10,后来执行了finally代码块把a的变量给赋值为20,但是test方法的调用者拿到的是方法预留的那块内存空间的值,所以结果是10,而第二段代码中的,返回值类型是引用类型,所以当引用类型进行赋值的时候是进行的引用传递,因此test方法的调用者拿到的是一个引用变量,其实是一个内存空间的地址值,所以finally代码块中执行后会改变返回值。

总结:finally代码块是一定会执行的,即使前边先执行了return语句,它也同样执行,至于finally会不会修改返回值,这取决与方法的返回值类型究竟是基本类型还是引用类型(对基本类型和引用类型不熟悉的请自行学习)

以上是关于return和finally究竟谁先执行,还有return是怎么返回数据的的主要内容,如果未能解决你的问题,请参考以下文章

Java深入学习23:try catch finally执行和返回逻辑

Python中的神坑return和finally

return与finally的执行顺序的影响(skycto JEEditor)

简单分析return和finally的执行顺序

finally 和 return语句执行的先后顺序

try..catch..finally执行顺序return