Java 中的 断言(assert) 是一种用于调试和开发阶段的辅助机制,主要用来检查程序中的不变量或假设是否成立。它不适合用于生产环境的业务逻辑校验。
下面从 语法、启用方式、常见用法、注意事项 等方面系统说明。
Java 断言有两种形式:
assert condition;
等价于:
if (!condition) {
throw new AssertionError();
}
assert condition : message;
等价于:
if (!condition) {
throw new AssertionError(message);
}
⚠️ 默认情况下,断言是关闭的
java -ea MyApp
或:
java -enableassertions MyApp
java -ea:com.example... MyApp
java -da MyApp
✅ IDE(如 IDEA)中运行程序时,默认通常未开启断言
public double divide(int a, int b) {
assert b != 0 : "除数不能为 0";
return a / (double) b;
}
✅ 用于表达“这里一定不会发生的情况”
public void process(int value) {
int result = value * 2;
assert result % 2 == 0 : "结果必须是偶数";
}
public int abs(int x) {
int result = x < 0 ? -x : x;
assert result >= 0 : "绝对值不能为负数";
return result;
}
assert list.size() == 3 : "list 大小应为 3";
| 对比项 | assert | if + throw 异常 |
|---|---|---|
| 用途 | 调试、内部假设 | 业务校验 |
| 是否可关闭 | ✅ 可被关闭 | ❌ 不可关闭 |
| 生产环境 | ❌ 不建议使用 | ✅ 推荐使用 |
| 异常类型 | AssertionError |
各种异常 |
✅ 不应用 assert 做参数校验或业务判断
assert age > 0; // 错误示例
✅ 正确做法:
if (age <= 0) {
throw new IllegalArgumentException("年龄必须大于 0");
}
assert obj.init(); // 危险
如果断言关闭,init() 不会执行!
✅ 适合使用 assert 的场景
❌ 不适合使用 assert 的场景
assert 是用于“程序员对程序正确性的假设检查”,不是用于“程序对外部世界的校验”。
如果你愿意,我也可以帮你对比 assert vs JUnit Assertions vs Guava Preconditions vs if-throw 的使用场景。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。