简介
断言是使用Java中的 assert
语句实现的。 在执行断言时,它被认为是正确的。 如果失败,JVM会抛出一个名为 AssertionError
的错误。 它主要用于开发过程中的测试目的。
assert
语句与布尔表达式一起使用,可以用两种不同的方式编写:
assert expression;
assert expression1 : expression2;
复制代码
示例
public class AssertTest {
public static void main(String[] args) {
int value = 15;
assert value >= 20 : " Underweight";
System.out.println("value is " + value);
}
}
复制代码
输出:
value is 15
复制代码
可以看到 assert
语句并没有起作用,这是因为Java在执行程序的时候默认是不启动断言检查的,即所有的断言语句都将被忽略。
如果要开启断言检查,则需要使用 -enableassertions
或 -ea
JVM参数来开启;如果要手动忽略断言检查,则可以通过使用 -disableassertions
或 -da
JVM参数来忽略断言语句。
执行命令 java -ea AssertTest
开启断言后的输出:
Exception in thread "main" java.lang.AssertionError: Underweight
at AssertTest.main(AssertTest.java:11)
复制代码
使用第一种无错误信息提示的语法编写:
public class AssertTest {
public static void main(String[] args) {
int value = 15;
assert value >= 20;
System.out.println("value is " + value);
}
}
复制代码
输出:
Exception in thread "main" java.lang.AssertionError
at AssertTest.main(AssertTest.java:11)
复制代码
为什么使用断言
- 确保看起来无法到达的代码实际上是无法到达的
- 确保假设时正确的
- 确保
switch case
的default
分支无法到达 - 检查对象的状态
- 在方法的开始检验
- 在方法调用后检验
注意事项
断言主要用于检查逻辑上不可能的情况。例如,它们可用于检查代码在开始运行之前期望的状态或在代码结束运行之后的状态。与普通的异常/错误处理不同,断言通常在运行时被禁用。
在哪里使用断言
- 私有方法的参数。私有参数仅由开发人员的代码提供,开发人员可能希望检查其关于参数的假设
- 分支条件,例如
switch
语句 - 方法开头的条件
哪里不使用断言
- 断言不应用于替换错误/异常消息
- 断言不应用于
public
方法中的参数,因为它们可能由用户提供 - 断言不应在命令行参数上使用
小结
- 断言是一种调试方式,断言失败会抛出
AssertionError
,只能在开发和测试阶段启用断言 - 对可恢复的错误不能使用断言,而应该抛出异常
- JAVA中断言很少被使用,更好的方法是编写单元测试
参考文献: