在 Java 里使用 assert 断言,目的并不是“验证业务条件”,而是在开发和测试阶段帮助发现程序内部逻辑错误。要理解“为什么要用它”,最好从它的设计定位和适用场景来看。
一句话总结:
断言用于表达“程序员认为永远为真”的条件,而不是用户约束或运行时校验。
它主要解决的是:
int age = calculateAge();
assert age >= 0 : "age must not be negative";
这句话的语义是:
“如果 age < 0,那说明我的程序逻辑出错了。”
比写注释更有约束力。
断言失败会抛出:
AssertionError
而且:
Exceptioncatch 正常恢复相比悄悄继续执行,断言失败更安全。
Java 的断言是运行时可关闭的:
java -ea com.example.Main # 开启断言
java -da com.example.Main # 关闭断言(默认)
✅ 好处:
对比一下:
if (age < 0) {
throw new IllegalArgumentException("age < 0");
}
✅ 适合:
assert age >= 0 : "age must >= 0";
✅ 适合:
void process(int value) {
assert value > 0 : "value must be positive";
// 后续逻辑
}
int result = doSomething();
assert result != -1 : "result should not be -1";
class Stack {
private int size;
void push(int v) {
size++;
assert size >= 0;
}
}
❌ 不要用 assert 做参数校验
// 错误示例
public void setAge(int age) {
assert age >= 0;
}
原因:
✅ 应该用异常:
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("age < 0");
}
}
❌ 不要用于用户可感知的错误
| 场景 | 是否适合 assert |
|---|---|
| 用户输入错误 | ❌ |
| 文件不存在 | ❌ |
| 数据库连不上 | ❌ |
| 方法内部逻辑错误 | ✅ |
因为:
Java 使用 assert,是为了在开发和测试阶段,用最小成本表达并验证“程序内部不应该被破坏的假设”。
如果你愿意,我也可以:
assert vs JUnit 测试AssertionError 不是 Exception免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。