在 Java 里,断言(assert)是用于开发和测试阶段的调试工具,而不是用来做正常的程序逻辑校验。下面从什么时候用、什么时候不能用、常见误区几个方面说明。
assert condition;
assert condition : "错误信息";
java -ea MyApp
# 或
java -enableassertions MyApp
用于程序内部逻辑正确性,而不是用户输入或外部环境。
void process(int value) {
assert value >= 0 : "value 不可能为负数";
// 后续逻辑
}
含义是:
如果这里 value < 0,说明我的代码有 bug,而不是用户错了。
private int divide(int a, int b) {
assert b != 0 : "除数不能为 0";
return a / b;
}
说明:
b == 0 是程序逻辑错误比抛异常更轻量,只在开发时有效。
// 错误示例
public void setName(String name) {
assert name != null; // ❌
this.name = name;
}
原因:
✅ 正确做法:
public void setName(String name) {
if (name == null) {
throw new IllegalArgumentException("name 不能为 null");
}
this.name = name;
}
这些都可能出错,要用异常。
// 错误示例
assert user.hasPermission() : "无权限";
doSomething();
原因:
✅ 用异常或返回结果:
if (!user.hasPermission()) {
throw new SecurityException("无权限");
}
| 场景 | 用 Assert | 用 Exception |
|---|---|---|
| 程序内部逻辑错误 | ✅ | ❌ |
| 用户输入错误 | ❌ | ✅ |
| 外部系统错误 | ❌ | ✅ |
| 业务流程控制 | ❌ | ✅ |
| 生产环境必须生效 | ❌ | ✅ |
一句话总结:
Assert 是给程序员看的,异常是给程序看的。
int result = compute(x);
assert result > 0 : "计算结果非法";
class Stack {
private int size;
void push(int v) {
size++;
assert size >= 0 : "size 不可能为负";
}
}
Java assert 只用于“调试阶段验证内部假设”,不是用来替代异常进行正常校验。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。