资讯专栏INFORMATION COLUMN

try catch finally

xialong / 695人阅读

摘要:中,然后去执行,发现中也有,然后就执行的是中的,返回值为。我们看看中对变量的改变对返回值有没有影响。中中中这里虽然执行了,但是改变的是的值,并没有改变返回值。

问题描述 笔试

这是京东校招的笔试题:

运行

打印运行结果,就是3

分析

我们将returnfinally拆为几种情况综合分析。

finally之后return
private static int func() {
    int a = 1;
    try {
        System.out.println("try");
        return a;
    } catch (Exception e) {
        System.out.println("catch");
    } finally {
        System.out.println("finally");
    }
    System.out.println("afterFinally");
    return 10;
}

看执行结果,我们分析return的原理。

try中执行到return时,先把这个值存起来,再开辟一块内存存这个值,然后去执行finallyfinally执行之后,回去执行之前没执行完的return语句,将值返回。所以这种情况下,finally后的代码块是不执行的。

finally中return
private static int func() {
    int a;
    try {
        System.out.println("try");
        a = 1;
        return a;
    } catch (Exception e) {
        System.out.println("catch");
        a = 2;
        return a;
    } finally {
        System.out.println("finally");
        a = 3;
        return a;
    }
}

这就和笔试题中一样了。

tryreturn,然后去执行finally,发现finally中也有return,然后就执行的是finally中的return,返回值为3

finally中改变变量的值 基本数据类型

将上一个例子中finally中的return a;删了,就是我们接下来的测试。我们看看finally中对变量的改变对返回值有没有影响。

private static int func() {
    int a;
    try {
        System.out.println("try");
        a = 1;
        return a;
    } catch (Exception e) {
        System.out.println("catch");
        a = 2;
        return a;
    } finally {
        System.out.println("finally");
        a = 3;
    }
}

trya = 1;

tryreturn a;

finallya = 3;

这里虽然执行了a = 3,但是改变的是a的值,并没有改变返回值。

要是不信我们在finally再添加一行输出以验证我们的猜想。

引用数据类型

相信这里我分为两个类别来叙述,熟悉Java的你应该明白我接下来要说什么了。

建个类MyObject,这里是为了演示方便才将value设置为public的,不要效仿啊。

public static void main(String[] args) {
    MyObject object = func();
    System.out.println(object.value);
}

private static MyObject func() {
    MyObject myObject = new MyObject();
    try {
        System.out.println("try");
        myObject.value = 1;
        return myObject;
    } catch (Exception e) {
        System.out.println("catch");
        myObject.value = 2;
        return myObject;
    } finally {
        System.out.println("finally");
        myObject.value = 3;
    }
}

与之前类似,不过这里是在finally中修改对象的属性。

运行,返回的结果是我们在finally中改变过的值。

finally中改变的,是myObject这个对象的value值,这个对象在堆内存中,而栈内存中用于返回的对象,其实也是堆内存中对象的引用,所以finally的改变会改变引用数据类型的返回值。

总结
格物致知,这是对基础的最佳实践。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76855.html

相关文章

  • try-catch-finally中的return

    摘要:基础系列的与方法类初始化顺序线程池如何弹性伸缩的几个要点的缓存什么场景下使用阻塞队列的使用及模式中的序本文主要简述中有的情况。参考关于中的执行顺序 Java基础系列 Java的hashcode与equals方法 Java类初始化顺序 ThreadPoolExecutor线程池如何弹性伸缩 HashMap的几个要点 Integer的缓存 什么场景下使用阻塞队列 volatile的使用及...

    fizz 评论0 收藏0
  • Will it finally: 关于 try/catch 的一些细节

    摘要:随着的出现,我最近发现自己在我的代码中使用了更多。但老实说,我终于用做了一点练习。当我去实际使用它时,我有点不确定它的细节。事实上,这就是本文的灵感来源。 随着async /await的出现,我最近发现自己在我的代码中使用了更多try /catch /finally。但老实说,我终于用finally做了一点练习。当我去实际使用它时,我有点不确定它的细节。所以我把几个例子放在一起。 当你...

    asce1885 评论0 收藏0
  • Will it finally: 关于 try/catch 的一些细节

    摘要:随着的出现,我最近发现自己在我的代码中使用了更多。但老实说,我终于用做了一点练习。当我去实际使用它时,我有点不确定它的细节。事实上,这就是本文的灵感来源。 随着async /await的出现,我最近发现自己在我的代码中使用了更多try /catch /finally。但老实说,我终于用finally做了一点练习。当我去实际使用它时,我有点不确定它的细节。所以我把几个例子放在一起。 当你...

    zhangrxiang 评论0 收藏0
  • Will it finally: 关于 try/catch 的一些细节

    摘要:随着的出现,我最近发现自己在我的代码中使用了更多。但老实说,我终于用做了一点练习。当我去实际使用它时,我有点不确定它的细节。事实上,这就是本文的灵感来源。 随着async /await的出现,我最近发现自己在我的代码中使用了更多try /catch /finally。但老实说,我终于用finally做了一点练习。当我去实际使用它时,我有点不确定它的细节。所以我把几个例子放在一起。 当你...

    褰辩话 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<