码迷,mamicode.com
首页 > 其他好文 > 详细

关于finally对返回值的影响

时间:2019-09-02 00:03:44      阅读:189      评论:0      收藏:0      [点我收藏+]

标签: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());
    }
}
View Code

上述代码返回结果:

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对返回值的影响

标签:ring   exit   影响   splay   sed   value   stat   这不   返回结果   

原文地址:https://www.cnblogs.com/yangfei629/p/11444086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!