Java陷阱之assert关键字详解

Assert.isTrue()方法用于断言条件是否为真,如果条件不满足(即为false),则会抛出IllegalArgumentException,并附带预设的错误信息。在示例中,当1.23不小于2.23时,方法抛出了异常,显示1.23小于2.23。此方法常用于单元测试中确保代码行为符合预期。

Assert.isTrue(express,message) 是指测试指定的条件是否为True,如果为True,则测试通过,如果表达式express为false,则才输出信息。

示例代码如下:

java 复制代码
public class AssertDemo {
    public static void main(String[] args) {

        Double num = new Double(1.23);

        Assert.isTrue(num.compareTo(new Double(2.23)) == 1, "1.23小于2.23");
    }
}

运行结果如下:

java 复制代码
Exception in thread "main" java.lang.IllegalArgumentException: 1.23小于2.23
	at org.springframework.util.Assert.isTrue(Assert.java:116)
	at org.sang.test.AssertDemo.main(AssertDemo.java:15)

我们查看下Assert.isTrue()源码:

java 复制代码
 public static void isTrue(boolean expression, String message) {
        if (!expression) {
            throw new IllegalArgumentException(message);
        }
    }

发现,当expression为true时则通过,不发生异常,当expression为false时,则会抛出异常。

一、org.springframework.util.Assert断言工具类

1 对象和类型断言
  • notNull(Object object, String message):入参一定不是 null;
  • isNull(Object object, String message):入参一定是 null;
  • isInstanceOf(Class type, Object obj, String message):检查对象必须为另一个特定类型的实例
java 复制代码
public void сhangeEngine(Engine engine) {
    Assert.isInstanceOf(ToyotaEngine.class, engine);
    // ToyotaEngine 是类 Engine的子类,可以通过
}
  • isAssignable(Class superType, Class subType, String message):subType 必须可以按类型匹配于 superType
2 文本断言

通常用来检查字符串参数。

  • hasLength(String text, String message):当 text 为 null 或长度为 0 时抛出异常,空格算长度为1;
  • hasText(String text, String message):text 不能为 null 且必须至少包含一个非空格的字符,否则抛出异常;

两者都区别:

hasLength(String text)文本为空格时不会抛出异常,但是hasText(String text)在空格的时候会抛出异常。

3 集合断言
  • notEmpty(Collection collection, String message):当集合未包含元素时抛出异常。

二、同一异常捕获

因为Spring断言机制都会对未通过判断的地方抛出异常,所以,我们需要集中对这些异常进行捕获处理。采用AOP的方式,部分示例代码如下:

java 复制代码
try {
     ...
 } catch (IllegalArgumentException ill) {
     logger.error(ill.getMessage());;
     return null;
 } catch (Throwable throwable) {
     logger.error(throwable.getMessage());
     return null;
 }
相关推荐
sleven fung11 分钟前
MinerU与BabelDOC与KTransformers与OpenAI API库
开发语言·python·ai·langchain
小毛驴85020 分钟前
spring-boot-maven-plugin,maven-compiler-plugin 功能对比
java·python·maven
萤萤七悬24 分钟前
【Python笔记】AI帮实现CLI工具-使用argparse.ArgumentParser接收命令参数
开发语言·笔记·python
iCxhust33 分钟前
C# 命令行指令 查看二进制文件
开发语言·单片机·嵌入式硬件·c#·proteus·微机原理·8088单板机
csdn_aspnet38 分钟前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
霸道流氓气质44 分钟前
通义灵码 IDEA 插件完全使用指南
java·ide·intellij-idea
诸葛务农1 小时前
道路行驶条件下电动汽车永磁电机的有效使用寿命及永磁体的失效和回收再利用(下)
java·开发语言·算法
Percep_gan1 小时前
Java8中的stream的测试使用
java
oort1231 小时前
VLStream:全开源决策式AI视频平台,赋能企业构建自主可控、降本增效的智能视觉应用介绍
大数据·开发语言·人工智能·开源·音视频·数据库架构
砍材农夫1 小时前
物联网实战:Spring Boot MQTT | MQTT 设备模拟器演示(附源码)
java·spring boot·后端·物联网·spring·netty