• 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

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

     

  • 相关阅读:
    Java实现 LeetCode 365 水壶问题
    Java实现 LeetCode 363 矩形区域不超过 K 的最大数值和
    Java实现 LeetCode 363 矩形区域不超过 K 的最大数值和
    Java实现 LeetCode 363 矩形区域不超过 K 的最大数值和
    Java实现 LeetCode 357 计算各个位数不同的数字个数
    Java实现 LeetCode 357 计算各个位数不同的数字个数
    Java实现 LeetCode 357 计算各个位数不同的数字个数
    Java实现 LeetCode 355 设计推特
    利用linux信号机制调试段错误(Segment fault)
    LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别
  • 原文地址:https://www.cnblogs.com/liruilong/p/11250521.html
Copyright © 2020-2023  润新知