关于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());
    }
}
View Code

上述代码返回结果:

valueInt1=10
valueInt2=11
valueStr=yy
valueModel=ff

结论:

a、对于基本类型或常量(如String) finally里即使修改了,也不会影响返回结果。

b、如果是对象类型,finally里修改了对象 是影响返回结果的。(因为复杂对象传递的是指针 指针指向的内存区域是一样的。)

所以不要在finally里return。这不是常规做法。

扫描二维码关注公众号,回复: 7150850 查看本文章

2、finally里不要再抛出异常


finally里再有异常 需要在finally里就捕获 打日志,不要再往外抛出,否则会覆盖try catch中原有的异常信息。

3、finally一定会执行吗


通常来说finally块一定会执行,常用于关闭流操作。

但如果try catch里执行了System.exit操作 表示虚拟机终止,则不会再执行finally。

猜你喜欢

转载自www.cnblogs.com/yangfei629/p/11444086.html