Java try 与 finally 对于返回值的影响

简介: Java try 与 finally 对于返回值的影响

前言



话说在前头, 不建议在finally里操作返回值 ,当然这也仅仅是建议,有些场景你不得不在finally里去操作返回值,那也无妨。


而无妨的前提则是,你对finally操作返回值有所了解。


正文



先来个开胃菜,


如果try里存在 return ,finally 也存在 return ,那么执行的是 finally 里的 return:


image.png


那么 try里面的retrun是否有执行? 答案是有的,只是执行后,会因为存在finally块而停止,先去执行finally,而在执行finally块时执行了finally里的return,直接结束了函数。

 

继续上菜,


image.png


这道菜,可以看到虽然在finally块里对a的值有重新赋值为200,但是最后获取到的返回值是100.


从明面上看,就是finally里面的对返回值a的赋值是无用的。


为什么会这样?不着急,再看一个例子,上面那个例子里使用的int类型变量,我们现在使用String:


image.png


没错,还是一样,finally里面对返回值 a的赋值是无用的。


对于上面这些场景做个小白文分析总结,


当返回的是基本变量(String不可变归在一块):


1.执行到try块 里面的 return 时,在返回的那一刹那,回去检测是否存在finally块,如果存在finally块,回去执行完finally块的代码,再进行返回(如果finally里面有retrun的话,就是直接在finally里面进行结束了,也就是文章开头的情况)。


2.在执行到 try块 里面的 return 时   与  准备 执行完finally块的代码  之间,  会把 try块 里面的 return 的值暂且寄存起来,等执行完回到return的时候,拿出来之前的值进行返回。


那也就是为什么在 finally 块里修改a的赋值,并没有影响 try 里面的 retrun 值了。


是因为到finally块前,就悄悄存起来需要返回的变量值了。


结合举例说明,try 的 return 存起来的变量值是 ‘hello’ ;


在 finally 的时候, 对a的赋值 ‘hahaha’,对存起来的变量值是 ‘hello’ 没有影响;


所以执行完 finally 块后, return 去寄存处拿出来的 返回值是 ‘hello’。


那么接下来我们看看这个例子,


返回的是引用数据类型(对象):


image.png


可以看到上面例子,finally里面对user对象里面的属性 name修改,生效了,return的对象 user里面的name受到了影响。


为什么呢?


因为在寄存的时候存起来的是user 的引用地址, 例如,存起来的引用地址是 ‘A00101’,这个引用地址里面的name值是‘NAME B’。


如果在fianlly块里是将 user 指向另一个引用地址'B00101',那么这种情形返回的时候,从寄存出拿出来 ‘A00101’的对象的值,那返回的name属性 肯定还是‘NAME B’,

如下图:


image.png


但是可以看到我们这个受影响的例子里面,在 finally 块里并不是重新将 user 指向另一个引用地址'B00101',


而是直接去动了 引用地址是 ‘A00101’ 这各user里面的属性name,也就是直接把存起来的这个  ‘A00101’ 关联的 user 对象里的属性给改了。


所以在 return 对象 user的时候,拿出来 ‘A00101’  的 name 受到了影响,因为它不干净了被动了。


该篇就到此,使用它,必须了解它。

相关文章
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
50 2
|
2月前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
25 1
|
2月前
|
Java
Java“缺少返回值”解决
在Java中,如果方法声明了返回类型,则必须确保所有可能的执行路径都返回一个值。解决“缺少返回值”问题的方法包括:使用默认返回值、抛出异常或确保所有条件分支都有返回值。
29 1
|
2月前
|
缓存 安全 Java
Java中 final、finally、finalize 有什么区别?
本文详细阐述了Java中`final`、`finally`和`finalize`的区别:`final`用于修饰类、方法和变量以表示不可变性;`finally`是用于确保在`try-catch`结构中无论是否发生异常都能执行的代码块;而`finalize`是`Object`类的方法,用于在对象被垃圾回收前执行清理工作,但在JDK 9中已被标记为弃用。
40 0
Java中 final、finally、finalize 有什么区别?
|
7月前
|
Java API
【JAVA】final、finally、finalize 有什么区别?
【JAVA】final、finally、finalize 有什么区别?
|
4月前
|
Java
【Java基础面试三十九】、 finally是无条件执行的吗?
这篇文章解释了Java中的finally块的特性,即无论是否发生异常或执行了return语句,finally块都会无条件执行,除非使用System.exit()退出虚拟机。
|
4月前
|
Java
【Java基础面试四十】、在finally中return会发生什么?
文章讨论了在Java中finally块中使用return语句的问题,指出如果在finally块中使用return或throw语句,将导致try块或catch块中的相应语句失效,因为finally块中的return或throw会终止方法,之后系统不会再执行try或catch块中的代码。
|
7月前
|
存储 Java
Java中带返回值方法的定义与调用技术
Java中带返回值方法的定义与调用技术
99 1
|
6月前
|
Java
java反射-动态调用方法(无参无返回值、有参无返回值、有参有返回值)
java反射-动态调用方法(无参无返回值、有参无返回值、有参有返回值)
|
7月前
|
Java
滚雪球学Java(35):揭秘Java方法的返回值,从void到诸多数据类型
【5月更文挑战第10天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
89 0
滚雪球学Java(35):揭秘Java方法的返回值,从void到诸多数据类型