spring中关键字Assert和jdk的assert关键字
你提出的问题非常关键,涉及到 Java 中两种不同的 assert 用法:
✅ 一、你提到的两种 assert
类型 示例 来源 特点
JDK 自带的 assert 关键字 assert str != null; Java 原生语言特性(JDK 1.4+) 可开关控制,默认关闭
Spring 的 Assert 工具类方法 org.springframework.util.Assert.notNull(str, "str不能为空"); Spring 框架工具类 运行时始终生效
🔍 二、详细对比说明
🧩 1. assert 是 Java 原生关键字(Runtime可关闭)
Java
深色版本
public void test2() {
String str = null;
assert str != null; // JDK 原生断言
}
✅ 特性:
是 Java 原生支持的语言特性。
默认关闭:在 JVM 启动时如果不加 -ea(enable assertions),这一句 不会执行。
如果启用,当条件为 false 时会抛出 AssertionError(继承自 Error)。
⚠️ 缺点:
不适合用于参数校验或业务逻辑判断,因为:
默认是不开启的,容易造成误判。
抛出的是 AssertionError,一般用于开发/测试阶段,不应该出现在生产代码中。
🧪 使用方式示例:
启动命令必须加上 -ea 才能生效:
Bash
深色版本
java -ea MyClass
否则断言完全不起作用!
🧩 2. org.springframework.util.Assert 是 Spring 提供的运行时检查工具类
Java
深色版本
import org.springframework.util.Assert;
public void test2() {
String str = null;
Assert.notNull(str, "字符串不能为 null");
}
✅ 特性:
是 Spring 框架提供的工具类方法。
运行时始终生效,不需要任何特殊 VM 参数。
当断言失败时会抛出 IllegalArgumentException。
更适合于业务逻辑中的参数校验、空值检查等场景。
📌 常用方法:
方法 用途
Assert.notNull(obj, "msg") 判断对象不为 null
Assert.hasText(str, "msg") 判断字符串非空(非 null 且非空白)
Assert.isTrue(condition, "msg") 判断布尔值为 true
Assert.state(condition, "msg") 判断状态正确(如用于校验流程状态)
✅ 三、总结对比表
对比维度 assert(JDK关键字) Assert(Spring工具类)
是否属于Java原生语法 是 ✅ 否 ❌(第三方库)
是否默认开启 否 ❌(需要 -ea) 是 ✅(始终启用)
失败后抛出异常类型 AssertionError IllegalArgumentException
是否适合用于生产环境 否 ❌(易被忽略) 是 ✅(推荐使用)
是否受JVM参数影响 是 ✅(依赖 -ea) 否 ❌
推荐用途 开发调试阶段辅助检查 生产级参数校验、状态检查
✅ 四、实际建议
在日常开发中:
🔹 尽量不用 JDK 的 assert
除非你很清楚自己在做什么,并且保证在测试环境中启用了 -ea,否则 不要把 assert 用于真正的校验逻辑。
🔹 推荐使用 Spring 的 Assert
尤其在 Spring Boot 项目中,Spring 的 Assert 类已经广泛用于 Controller、Service 层的参数校验,例如:
Java
深色版本
public void createUser(String username) {
Assert.hasText(username, "用户名不能为空");
// ...
}
或者你可以使用 JSR 380 标准注解(如 @Valid)来替代部分手动校验。
✅ 五、扩展:其他类似的断言工具类
如果你没用 Spring,也可以考虑:
工具类 来源 示例方法
org.apache.commons.lang3.Validate Apache Commons Lang Validate.notNull()
com.google.common.base.Preconditions Google Guava checkNotNull()
Objects.requireNonNull() JDK 自带 用于简单 null 判断
✅ 六、结论
不要混淆 assert 和 org.springframework.util.Assert。
assert 是 JDK 原生的关键字,用于调试,生产慎用;
Assert 是 Spring 提供的工具类,功能强大,适合用于运行时校验;
在开发中应优先选择 Assert.notNull(...) 等运行时校验方式,避免因未启用 -ea 导致空指针等严重错误。
如果你希望我帮你写一个统一的参数校验工具类,或者想了解如何结合 AOP 实现自动校验,也欢迎继续提问!