关于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());
    
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对返回值的影响的主要内容,如果未能解决你的问题,请参考以下文章

try-catch-finally对返回值的影响

字节码分析finally块对return返回值的影响

异常处理 try...catch...finally 执行顺序, 以及对返回值得影响

带返回值的 try finally 构造 [重复]

static 和 final 关键字 对实例变量赋初始值的影响

C#常见面试题——try-catch-finally-return