标签:ring exit 影响 splay sed value stat 这不 返回结果
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。
标签:ring exit 影响 splay sed value stat 这不 返回结果
原文地址:https://www.cnblogs.com/yangfei629/p/11444086.html