在 Java 中,assert 断言的效率特点可以简单概括为:
开启时有一定开销,关闭时几乎零成本(可被 JVM 完全消除)。
下面详细说明。
Java 的 assert 是关键字,不是方法:
assert condition;
assert condition : "error message";
是否生效由 JVM 启动参数控制:
java -ea MyApp # 启用断言(enable assertions)
java -da MyApp # 禁用断言(默认)
⚠️ 默认情况下断言是关闭的
assert x > 0;
在 -da(默认)下:
✅ 运行效率:几乎为零
这也是为什么官方允许在代码里大量使用 assert 做“防御性检查”。
-ea)当启用断言:
assert
AssertionError开销主要来自:
例如:
assert list.size() > 0 : "list is empty, size=" + list.size();
⚠️ 即使断言成功,"list is empty..." 也可能被拼接(取决于 JVM 实现)
| 方式 | 是否默认开启 | 性能 | 用途 |
|---|---|---|---|
assert |
❌ 默认关闭 | 极低(关闭时) | 开发期检查 |
if + throw |
✅ 永远执行 | 较高 | 运行时校验 |
| 单元测试 | ✅ 测试时 | 无运行影响 | 功能验证 |
✅ assert 不适合做业务校验 ✅ 适合做“不可能发生”的假设
assert param != null; // 内部不变量
assert index >= 0; // 算法前提
assert !list.isEmpty(); // 状态约束
assert user != null; // 用户输入
因为生产环境默认关闭,会导致“静默错误”。
如果你愿意,我也可以:
assert vs Objects.requireNonNull免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。