java 的 assert 语句默认不执行,必须通过 jvm 参数 -ea 启用;支持全局、包级、类级启用或局部禁用;ide 和 gradle 需显式配置;断言第二参数应避免引发异常的表达式。

Java 的 assert 语句默认完全不执行,必须配合 JVM 的 -ea(即 -enableassertions)参数才能生效。写了 assert x != null; 却没抛错?不是代码有问题,是开关没打开。
怎么开启断言:-ea 是唯一入口
-ea 是 JVM 启动时的参数,不是编译选项,也不是 IDE 默认配置。不加它,所有 assert 都被跳过,连条件表达式都不会求值——字节码里存在,但运行时直接忽略。
- 全局启用:
java -ea MyApp - 只对某个包启用:
java -ea:com.example.service MyApp(注意末尾不加.*,JVM 会自动匹配子包) - 只对某个类启用:
java -ea:MyTest.class MyApp - 局部禁用(比如跳过第三方库):
java -ea -da:org.apache.commons MyApp
IDE 里常漏掉的关键配置
IntelliJ 或 Eclipse 写完 assert 后调试没反应?大概率是运行配置没填 -ea。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- IntelliJ:Run → Edit Configurations → 找到你的 Application → 在 VM options 栏里手动输入
-ea(已存在的配置不会自动继承模板) - Eclipse:右键项目 → Run As → Run Configurations → Arguments 标签页 → 在 VM arguments 中填入
-ea - 别只改 JRE 默认参数——那是全局模板,已有配置需单独设置
Gradle 测试也要显式开
单元测试跑断言失败?Gradle 默认不启用断言,得在 build.gradle 里声明:
test { jvmArgs = ['-ea'] }- 如果只想对测试类开,可写成
jvmArgs = ['-ea:com.example.MyTest'] - Spring Boot 项目若用
./gradlew bootTest,同样要确保 test 任务已配-ea
断言写法和避坑要点
启用后,assert 有两种合法形式,但第二参数容易出错:
-
assert list.size() > 0;—— 简单条件检查 -
assert list != null : "list is null";—— 第二参数只在断言失败时才求值 - ⚠️ 错误写法:
assert list != null : "size=" + list.size();—— 如果list为null,list.size()先触发NullPointerException,根本走不到 AssertionError - 推荐写法:
assert list != null : "list is null, expected non-null";(第二参数用纯字符串或安全表达式)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










