Java的异常处理中return和finally

文章讨论了Java中return和finally语句的执行顺序,特别关注了当finally中包含return语句时,对方法返回值的影响。无论try-catch代码块是否捕获异常,finally都会执行,但finally中的return可能改变方法的返回值。
摘要由CSDN通过智能技术生成

执行顺序:

如下代码:
简单定义一个类:

package top.ailvcheng.t0406_return;

import cn.hutool.core.lang.Assert;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
 * @ClassName Main
 * @Description return 和 finally,及 finally中有return
 * @Version 1.0
 **/
class Main {
    /**
     * return 和 finally
     *
     * @return
     */
    private static TestClass test(Integer num) {
        final TestClass.TestClassBuilder builder = TestClass.builder()
                .name("test");
        try {
            Assert.notNull(num, "num is null");
            System.out.println("1执行了");
            return builder.num(num).build();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            builder.num(333);
            System.out.println("2执行了 ");
            System.out.println(builder.build());
        }
        return builder.build();
    }

    private static TestClass test2(Integer num) {
        final TestClass.TestClassBuilder builder = TestClass.builder()
                .name("test");
        try {
            Assert.notNull(num, "num is null");
            builder.num(num);
            System.out.println("1执行了");
            return builder.build();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("2执行了");
            // finally中有return语句
            return builder.num(-1).build();
        }
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    @ToString
    private static class TestClass {
        private String name;
        private Integer num;
    }

    public static void main(String[] args) {
        System.out.printf("test num :%s\n", test(1));
        System.out.println("---------\n");
        // finally中有return ,返回结果受影响
        System.out.printf("test num :%s\n", test2(99));

        // 断言null
        System.out.printf("test num :%s\n", test(null));
        System.out.printf("test num :%s\n", test2(null));
    }
}



运行结果如下:

在这里插入图片描述
在这里插入图片描述

由此可见,

  1. 参数为null或正常,即无论何时,只要异常处理中使用finally,其代码块都会执行(除了程序或者线程提前退出)
  2. 若在某个具有返回值方法中进行异常处理且使用了finally,其执行位置处于 try-catch代码块退出前,即先return后finally,且在方法执行完取到值前 (且在其中操作了该对象的值,若finally中不含有return语句,不会影响返回值)
  3. 若finally中具有return语句,且修改了某个对象,或直接返回时操作了某个对象,会影响返回值
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值