使用断言
约 611 字大约 2 分钟
2025-07-15
断言 (Assertion) 是一种在程序中用于调试的手段,主要目的是验证程序中的某些假设是否成立。在 Java 中,assert
关键字用于实现断言。
以下是一个简单的断言示例:
public static void main(String[] args) {
double x = Math.abs(-123.45);
assert x >= 0;
System.out.println(x);
}
在这个例子中,assert x >= 0;
是一个断言语句,它声明 x >= 0
应该始终为 true
。如果断言条件的结果为 false
,则会抛出一个 AssertionError
。
为了提供更详细的调试信息,可以在 assert
语句中添加一个可选的断言消息:
assert x >= 0 : "x must >= 0";
如果断言失败,AssertionError
将会包含消息 "x must >= 0",这对于诊断问题非常有帮助。
6.1 断言的特点与适用场景
Java 断言的关键特性是,当断言失败时,程序会抛出 AssertionError
并终止执行。因此,断言不应用于处理程序可以恢复的错误情况。它主要用于在开发和测试阶段发现和修复问题。
例如,以下代码不适合使用断言:
void sort(int[] arr) {
assert arr != null;
}
因为 arr
为 null
是一种可以恢复的错误,更合适的做法是抛出一个异常:
void sort(int[] arr) {
if (arr == null) {
throw new IllegalArgumentException("array cannot be null");
}
}
6.2 启用断言
JVM 默认情况下是关闭断言的,这意味着 assert
语句会被忽略而不执行。
例如,考虑以下代码:
// assert
public class Main {
public static void main(String[] args) {
int x = -1;
assert x > 0;
System.out.println(x);
}
}
即使 x
实际上是 -1
,断言 x > 0
应该失败,但默认情况下程序会继续执行,而不会抛出 AssertionError
。
要启用断言,需要在运行 Java 程序时通过命令行传递 -enableassertions
或 -ea
参数给 Java 虚拟机。例如:
java -ea Main.java
此外,还可以选择性地对特定的类或包启用断言。使用 -ea:com.itranswarp.sample.Main
可以只对 com.itranswarp.sample.Main
类启用断言。使用 -ea:com.itranswarp.sample...
(注意结尾有 3 个点) 可以对 com.itranswarp.sample
包及其子包中的所有类启用断言。
6.3 实际开发中的应用
在实际开发中,断言的使用相对较少。更常见和推荐的做法是编写单元测试,例如使用 JUnit
框架。单元测试提供了一种更系统和全面的方法来验证代码的正确性。