当前位置: 首页 > ds >正文

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 实现自动校验,也欢迎继续提问!

http://www.xdnf.cn/news/3346.html

相关文章:

  • finereport普通报表设置冻结列后实现点击单元格整行背景变色
  • Kaamel白皮书:MCP安全实践
  • 司南评测集社区 4 月上新一览
  • 宝塔面板运行docker的jenkins
  • openharmony 4.1 运行busybox工具包(保姆教程)
  • HAproxy+keepalived+tomcat部署高可用负载均衡实践
  • 【Python】基于Python的图像分类:从基础CNN到ResNet的全面解析
  • ag-grid-react 列表导出csv列表getDataAsCsv (自定义导出列表配置)自定义新增,修改导出内容
  • 印刷企业绩效考核管理制度与绩效优化路径
  • 在Java中使用Files类的copy()方法复制文件的示例
  • B/S架构:定义、原理及其在软件测试中的应用
  • 利用SingleKeyDatabaseShardingAlgorithm,自定义分片算法实现
  • 简易APP更新功能
  • 深入理解CSS显示模式与盒子模型
  • 数据库12(游标)
  • 安全指南 | MCP安全检查清单:AI工具生态系统的隐形守护者
  • 深入浅出循环神经网络(RNN):原理、应用与实战
  • Tomcat DOS漏洞复现(CVE-2025-31650)
  • 数据库规范
  • 国产化海光C86架构服务器安装windows实录
  • Transformer架构指南:从原理到实战资源全更新
  • 用Power shell脚本批量发布rdl文件到SQL Server Reporting Service
  • 详细介绍C++中指针解引用
  • 枚举法——C++算法【泪光2929】
  • ShardingSphere5详细笔记
  • Vue2 和 Vue3 的核心区别
  • 腾讯云web服务器配置步骤是什么?web服务器有什么用途?
  • TM1668芯片学习心得二
  • 【SpringBoot】基于mybatisPlus的博客系统
  • 【计算机视觉】目标检测:深度解析MMDetection:OpenMMLab开源目标检测框架实战指南