Java、断言异常

本文介绍了一个名为`CommonUtil`的Java类,它提供了一个静态方法`require`,用于根据条件抛出指定类型的异常,同时利用了Lombok的`@SneakyThrows`注解来简化异常处理。测试代码展示了如何在测试中检查不同类型的异常是否被正确抛出。

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

在代码编写时经常需要判断条件并抛出异常,本程序使用类反射机制抛出异常,减少new操作。


package common.utils;

/** 公共类
 * @create: 2023/11/27
 * @Description:
 * @FileName: CommonUtil
 */
public class CommonUtil {
    private CommonUtil() {}

    /** 如果 !condition,抛出 cls 类型的异常,携带 message
     * @Description:
     * @date: 2023/11/27
     * @param cls 异常类
     * @param condition 条件
     * @param message 不满足条件时信息
     * @return: void
     */
    public static <E extends Throwable> void require(Class<E> cls, boolean condition, String message) {
        try {
            if (!condition) {
                throw cls.getConstructor(String.class).newInstance(message);
            }
        } catch (Throwable t) {
            // RuntimeException 不可缺少
            throw CommonUtil.<RuntimeException>throwEX(t);
        }
    }

    /** 参考 @{@link lombok.SneakyThrows} 注解,
     * 可将必检异常转换为免检异常
     * @Description:
     * @date: 2023/11/27
     * @param t 异常对象
     * @return: E
     */
    private static <E extends Throwable> E throwEX(Throwable t) throws E {
        throw (E) t;
    }
}

测试:

package common.utils;

import org.junit.Assert;
import org.junit.jupiter.api.Test;

class CommonUtilTest {

    @Test
    void require() {
        Assert.assertThrows(Throwable.class, () -> CommonUtil.require(Throwable.class, false, null));
        Assert.assertThrows(Error.class, () -> CommonUtil.require(Error.class, false, null));
        Assert.assertThrows(RuntimeException.class, () -> CommonUtil.require(RuntimeException.class, false, null));
        Assert.assertThrows(Exception.class, () -> CommonUtil.require(Exception.class, false, null));
        CommonUtil.require(IllegalStateException.class, false, "非法状态");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值