try catch finally 中的 finally 和 return

文章探讨了在Java中,try-catch-finally块如何影响返回值,特别是对于基本类型和引用类型的区别。在基本类型中,finally块的修改不会影响返回值,而在引用类型中,finally块对引用的修改会影响到返回值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试用例:

@Test
    public void test03(){
        System.out.println(tryCatchPrimitive());

        System.out.println(tryCatchReference());
    }

    private int tryCatchPrimitive(){
        int primitiveType = 0;
        try {
            primitiveType = 1;
            return primitiveType;
        } finally {
            primitiveType = 2;
        }
    }

    private Map<String, String> tryCatchReference(){
        Map<String, String> referenceType = new HashMap<>();
        referenceType.put("key", "init");
        try {
            referenceType.put("key", "try");
            return referenceType;
        } finally {
            referenceType.put("key", "finally");
            referenceType = null;
        }
    }

输出结果:

1
{key=finally}

分析

  • try catch finally 块中 try 与 finally 的关系和 catch(如果 catch 被执行到的话) 与 finally 的关系一样。

  • try finally return 要分析两种情况,一种是 return 基本数据类型,另一种是 return 引用类型。

  • try 和 catch 中的 return 是在 finally 执行之前执行,在 finally 执行之后返回。

第一个测试案例中 try 返回 变量 primitiveType,finally 修改了 primitiveType 的值,但是返回的到的值是 1,说明 finally 对 primitiveType 的修改没有生效。说明修改 primitiveType 并没有修改方法返回的值,因为方法将计算得到的返回值复制了一份保存起来,所以修改 primitiveType 的值并不会修改被保存起来的返回值。

在第二个案例中 try 返回变量 referenceType,finally 修改了 referenceType 中键为 key 的值,并将 referenceType 赋值为 null,方法返回的结果并不会 null,却键为 key 的值为 finally,说明 finally 块中对 referenceType 的修改影响了方法的返回值。这和案例一相悖。这是因为案例二的返回值是引用类型,对于引用类型方法保存的返回值是引用的地址,我们不妨将方法保存的变量叫 returnType,那么 returnType 和 referenceType 指向同一个 Map 对象,所以 referenceType 的修改会反应到 returnType 上,但是将 referenceType = null 并不会修改 returnType,所以返回的 Map 对象不是 null。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值