在 Java 里,Assert(断言) 主要用来在开发和测试阶段检查程序中的“不可能为假”的条件。它的原理可以从语言层面、JVM 实现、编译与运行几个角度来理解。
assert condition;
assert condition : message;
示例:
int age = -1;
assert age >= 0 : "age不能为负数";
这是断言最关键的一点:
断言默认是关闭的
必须在 JVM 启动参数中显式开启:
java -ea MyApp
# 或
java -enableassertions MyApp
关闭断言:
java -da MyApp
✅ 这意味着:
断言不是普通代码,而是一种“可选运行时检查机制”
在 .java 编译成 .class 后:
assert 并不是关键字级别的“魔法”例如:
assert x > 0;
在开启断言的情况下,大致等价于:
if (assertionsEnabled && !(x > 0)) {
throw new AssertionError();
}
如果是:
assert x > 0 : "x必须大于0";
大致等价于:
if (assertionsEnabled && !(x > 0)) {
throw new AssertionError("x必须大于0");
}
JVM 会为每个类维护一个“断言开关”:
-ea:开启某些类或包的断言-da:关闭某些类或包的断言例如:
java -ea:com.example... MyApp
JVM 内部会维护类似:
class 是否启用断言 → boolean
运行时:
AssertionError✅ 断言不是编译期删除,而是运行时条件跳过
AssertionErrorthrow new AssertionError();
特点:
AssertionError 继承自 Error| 对比项 | assert | if + throw |
|---|---|---|
| 是否默认启用 | ❌ 否 | ✅ 是 |
| 适用阶段 | 开发 / 测试 | 生产 |
| 失败类型 | AssertionError |
Exception |
| 是否可关闭 | ✅ | ❌ |
| 语义 | “这不可能发生” | “这是非法输入” |
✅ 断言不适合做参数校验等生产环境检查
// 内部逻辑保证不可能为假
assert list != null;
assert index >= 0 && index < size;
// 用户输入、外部参数
assert age > 0; // 错误示例
应改为:
if (age <= 0) {
throw new IllegalArgumentException("age必须大于0");
}
Java 的 assert 是一种由 JVM 控制的、可选的运行时检查机制,编译器将其转化为条件判断,在断言开启时若条件为假则抛出 AssertionError,默认情况下断言是关闭的。
如果你愿意,我也可以:
assert 的编译结果免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。