zoukankan      html  css  js  c++  java
  • 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

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

     

  • 相关阅读:
    在有跳板机的情况下,SecureCRT自动连接到目标服务器
    JavaScript中使用console调试程序的坑
    Python中docstring文档的写法
    Nginx+uWSGI+Django原理
    uWSGI uwsgi_response_write_body_do(): Connection reset by peer 报错的解决方法
    Python LOGGING使用方法
    Python计算斗牛游戏的概率
    Python垃圾回收机制详解
    PhantomJS实现最简单的模拟登录方案
    如何设置Jquery UI Menu 菜单为横向展示
  • 原文地址:https://www.cnblogs.com/liruilong/p/11250521.html
Copyright © 2011-2022 走看看