在 Java 中,断言(Assert)是一种用于在开发和测试阶段验证程序内部假设是否正确的机制。它并不是用来处理业务异常或进行参数校验的。下面从规范、语法、启用方式、使用约束和最佳实践几个方面系统说明。
Java 断言从 JDK 1.4 开始引入,关键字是 assert。
assert condition;
assert condition : message;
condition:必须为 boolean 类型message:可选,抛出的 AssertionError 的详细信息int a = 10;
assert a > 0; // 满足条件就什么都不发生
assert a == 5 : "a is not 5"; // 不满足会抛出 AssertionError
⚠️ 断言默认是关闭的,必须显式启用。
java -ea MyApp
# 或
java -enableassertions MyApp
java -ea:com.example... MyApp
java -ea:com.example.Test MyApp
java -da MyApp
✅ 内部逻辑正确性检查 ✅ “永远不应该发生”的情况 ✅ 开发和测试阶段
例如:
void process(int status) {
if (status == 1) {
// ...
} else if (status == 2) {
// ...
} else {
assert false : "unknown status: " + status;
}
}
❌ 不要用断言做参数校验 ❌ 不要用于用户输入校验 ❌ 不要用于生产环境逻辑控制
错误示例:
public void setName(String name) {
assert name != null; // ❌ 错误用法
this.name = name;
}
✅ 正确做法:
public void setName(String name) {
if (name == null) {
throw new IllegalArgumentException("name is null");
}
this.name = name;
}
原因:
如果断言未启用,参数校验直接失效。
断言失败会抛出:
java.lang.AssertionError
特点:
Error,不是 Exception✔ 只用于内部不变式检查
✔ 只用于开发和测试阶段
✔ 断言条件不应有副作用
✔ 断言失败表示程序 bug
❌ 不要用断言替代异常
❌ 不要在断言中修改变量
❌ 不要依赖断言来控制业务流程
| 场景 | 使用断言 | 使用异常 |
|---|---|---|
| 程序内部逻辑错误 | ✅ | ❌ |
| 用户输入错误 | ❌ | ✅ |
| 外部系统错误 | ❌ | ✅ |
| 方法参数校验 | ❌ | ✅ |
| 单元测试 | ✅ | ✅ |
assert param != null : "param must not be null";
int result = compute();
assert result >= 0 : "result negative";
default:
assert false : "unreachable code";
✅ 在 单元测试、调试、原型开发 中大量使用
✅ 在 生产环境默认关闭断言
✅ 和 JUnit / TestNG 的 assert 区分开
JUnit 的
assertEquals≠ Java 语言级assert
Java 断言用于验证“程序内部永远不应该出错的逻辑”,而不是处理“可能发生的错误”。
如果你愿意,我也可以帮你:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。