在 Java 中,断言(Assertion)是通过 assert 关键字实现的,主要用于在开发和测试阶段辅助发现程序错误。它并不是用来处理正常的业务逻辑或用户输入校验的。
下面从 使用方式、适用场景、不适用场景、注意事项 等方面系统说明。
assert condition;
assert condition : message;
示例:
int divide(int a, int b) {
assert b != 0 : "除数不能为 0";
return a / b;
}
⚠️ 默认情况下断言是关闭的,需要启用 JVM 参数:
java -ea MyApp
# 或
java -enableassertions MyApp
用于验证**“永远不应该发生”的情况**。
void process(int status) {
if (status == 1) {
// ...
} else if (status == 2) {
// ...
} else {
assert false : "未知状态: " + status;
}
}
✅ 适合:
private void internalProcess(int value) {
assert value >= 0 : "value 必须 >= 0";
// ...
}
✅ 适合:
❌ 不适合:
int sqrt(int x) {
int result = (int) Math.sqrt(x);
assert result * result <= x : "结果校验失败";
return result;
}
✅ 适合:
class Stack {
private int size;
private void checkInvariant() {
assert size >= 0 : "size 不能为负";
}
}
✅ 适合:
assert list != null;
assert list.size() > 0;
✅ 适合:
// 错误示例
public void setAge(int age) {
assert age > 0;
}
原因:
✅ 应使用异常:
if (age <= 0) {
throw new IllegalArgumentException("年龄必须大于 0");
}
// 错误
assert config != null;
原因:
✅ 使用正常判断或异常
断言 ≠ 测试框架
✅ 测试应使用 JUnit / TestNG
| 对比项 | assert | 异常 |
|---|---|---|
| 目的 | 程序内部正确性 | 处理可预期错误 |
| 是否可关闭 | ✅ 是 | ❌ 否 |
| 使用阶段 | 开发 / 测试 | 开发 / 生产 |
| 是否处理用户输入 | ❌ | ✅ |
| 是否用于业务逻辑 | ❌ | ✅ |
✅ 用 assert 的场景
❌ 不要用 assert 的场景
断言用于“证明程序是对的”,而不是“防止程序出错”。
如果你愿意,我也可以:
assert 和 JUnit assertThat免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。