关于finally对返回值的影响
Posted yangfei629
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于finally对返回值的影响相关的知识,希望对你有一定的参考价值。
1、finally对返回值的影响
我们知道finally在try中return语句执行之后 返回之前 执行的。
如果try中最后return一个变量 ,那finally也对这个变量修改后 到底会返回什么?
直接上测试代码看例子:
class YfModel private String name; public YfModel(String name) this.name = name; public String getName() return name; public void setName(String name) this.name = name; public class ExceptionYf public static int getIntValue1() int result =9; try result++; return result; finally //修改result的值 result++; public static int getIntValue2() int result =9; try result++; return result; finally //finally里直接return return ++result; public static String getStringValue() YfModel yfModel = new YfModel("default"); try yfModel.setName("yy"); return yfModel.getName(); finally //finally里修改对象的属性值 yfModel.setName("ff"); public static YfModel getModelValue() YfModel yfModel = new YfModel("default"); try yfModel.setName("yy"); return yfModel; finally yfModel.setName("ff"); public static void main(String[] args) System.out.println("valueInt1="+ getIntValue1()); System.out.println("valueInt2="+ getIntValue2()); System.out.println("valueStr="+ getStringValue()); System.out.println("valueModel="+ getModelValue().getName());
上述代码返回结果:
valueInt1=10
valueInt2=11
valueStr=yy
valueModel=ff
结论:
a、对于基本类型或常量(如String) finally里即使修改了,也不会影响返回结果。
b、如果是对象类型,finally里修改了对象 是影响返回结果的。(因为复杂对象传递的是指针 指针指向的内存区域是一样的。)
所以不要在finally里return。这不是常规做法。
2、finally里不要再抛出异常
finally里再有异常 需要在finally里就捕获 打日志,不要再往外抛出,否则会覆盖try catch中原有的异常信息。
3、finally一定会执行吗
通常来说finally块一定会执行,常用于关闭流操作。
但如果try catch里执行了System.exit操作 表示虚拟机终止,则不会再执行finally。
以上是关于关于finally对返回值的影响的主要内容,如果未能解决你的问题,请参考以下文章
异常处理 try...catch...finally 执行顺序, 以及对返回值得影响