在 Java 中,断言(assert)失败通常表示程序进入了“不应该发生的状态”。下面从原因、处理方式、常见坑几个方面说明。
当 assert 条件为 false 时,会抛出:
java.lang.AssertionError
示例:
assert x > 0 : "x must be positive";
如果 x <= 0,就会抛出:
Exception in thread "main" java.lang.AssertionError: x must be positive
⚠️ Java 的 assert 默认是关闭的!
运行程序时必须加:
java -ea MyProgram
# 或
java -enableassertions MyProgram
如果没开,断言不会执行,失败也不会报错。
✅ 检查:
java -ea -version
❌ 错误示例:
try {
assert false;
} catch (AssertionError e) {
// 忽略
}
断言失败是严重问题信号,不应被忽略。
断言适合:
assert list != null;
assert index >= 0 && index < size;
不适合:
assert userInput > 0; // ❌ 用户输入要用异常
✅ 用户输入用:
if (userInput <= 0) {
throw new IllegalArgumentException("must > 0");
}
断言信息很重要:
assert value != null : "value should not be null at step X";
失败时直接看:
如果你用的是 JUnit:
assertEquals(expected, actual);
失败会抛:
org.opentest4j.AssertionFailedError
这不是 Java 原生 assert,而是测试框架的断言。
✅ 解决方式:
| 原因 | 说明 |
|---|---|
忘了开启 -ea |
断言根本没生效 |
| 前置条件被破坏 | 方法调用顺序错误 |
| 状态不一致 | 并发 / 初始化问题 |
| 用断言代替异常 | 用户输入、外部数据 |
| 测试假设错误 | 单元测试写错预期 |
❌ 生产环境关键校验
❌ 参数合法性检查
❌ 可能抛出的业务错误
✅ 断言只用于:
“如果这里错了,说明程序有 bug”
-ea如果你愿意,可以把 报错信息 / 代码片段 发出来,我可以直接帮你定位是哪一类问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。