在 Java 中使用 assert 关键字(断言)时,有很多容易被忽视的“坑”,不少开发者在面试或实际排查问题时都踩过。下面按常见误区 → 风险 → 正确做法来说明。
Java 的 assert 默认不启用。
assert x > 0 : "x must be positive";
如果直接运行:
java Main
这行断言永远不会执行。
必须显式开启:
java -ea Main
# 或
java -enableassertions Main
❗ 生产环境 JVM 往往没开 -ea,断言形同虚设。
public void setAge(int age) {
assert age > 0;
this.age = age;
}
用异常,而不是断言:
if (age <= 0) {
throw new IllegalArgumentException("age must > 0");
}
✅ 断言只用于“不可能发生的情况”
assert list.remove(0) != null;
remove() 不会执行boolean removed = list.remove(0);
assert removed;
✅ 断言只做“判断”,不做“操作”
assert login();
业务判断必须用 if + 异常 / 返回值
开启断言后抛出:
java.lang.AssertionError
但很多人:
assert user != null : "user should not be null at this point";
“我有 assert,就不需要写测试”
✅ 断言 ≠ 测试工具
AssertionError 是 Error 不是 Exceptioncatch (Exception e) 捕获try {
assert false;
} catch (Exception e) {
// ❌ 抓不到
}
✅ 适合:
❌ 不适合:
Java 的 assert 是“开发期辅助工具”,不是“运行时防护机制”。
如果你愿意,我也可以对比 JUnit Assert / AssertJ / Guava Preconditions 的使用差异。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。