finally中return问题分析 && Ja…

2019-08-16 11:15:35来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

finally中return问题分析 && Java中返回值定义为int类型的 方法return 1返回的是int还是Integer

 

 

在Java中返回值定义为int类型的 方法return 1;中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型。

定义一个Test类,在异常处理try中和finally中分别return ;

 

public class Test {

    public static void main(String[] args) {
         System.out.println(new Test().test());
     }
     int test() {
         try {
             return func1();
         }finally{
             return func2();
         }
     }

     int func1() {
         System.out.println("func1");
         return 1;
     }

     int func2() {
         System.out.println("func2");
         return 2;
     }

 

运行结果:

 

嗯,没问题,最后执行finally改变return的返回值。下面在看一个:

 

public class Test {

    public static void main(String[] args) {
         System.out.println(new Test().test());
     }
    static int test()  {
        int x = 1;
        try {
            return x;
        }finally {
            ++x;
        }
    }
}

 

 

 按照上面的逻辑会返回执行结果为2,但结果并不是这样:

 

这里就要讲到finally对于return的处理:

在finally块中处理返回值,当定义为引用类型时,会先返回try中的返回值,然后执行finally会重置返回值,当定义为基本类型时,不会重置try的返回值。

异常代码加上try语句就标志着运行时会有一个Throwable线程监视该方法的运行,当出现异常时,交由异常逻辑处理,方法在栈内存中运行的,会按照“先进后出”的原则执行,main方法调用异常方法,main方法在下层,异常方法在上层。

当为基本类型时,异常方法执行完毕return x后,此方法的返回值以确定为固定值(基本类型为值拷贝),此后finally代码块修改已经没有意义(类似值传递,可以把finally块看做方法体)当为引用类型时,因为是地址拷贝,所以值会改变。(类似于地址传递)

 

即当定义为int类型时,return x;是值拷贝,所以finally无法修改x的值。

当为return 1;时,因为结果发生个改变,即返回的是finally中的值,即为地址拷贝,返回的是引用类型,即可确定return 1;此时为return new Integer(1);

即return 1;返回的是Integer对象。

关于finally中return的处理;学习与《编写高质量代码(改善Java程序的151个建议)》书中  第113条建议----不要在finally块中处理返回值;笔记见博客:https://blog.csdn.net/sanhewuyang/article/details/84333062

理解不足之处请大家指正。嗯,愿我们都被温柔以待。^_^

 


原文链接:https://www.cnblogs.com/liruilong/p/11250521.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java emoji持久化mysql

下一篇:Spring Cloud 之 Config与动态路由.