简介

断言是使用Java中的 assert 语句实现的。 在执行断言时,它被认为是正确的。 如果失败,JVM会抛出一个名为 AssertionError 的错误。 它主要用于开发过程中的测试目的。
assert 语句与布尔表达式一起使用,可以用两种不同的方式编写:

assert expression;
assert expression : errorMessage;

示例

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)

可以看到这里仅是抛出了 AssertionError,没有任何错误信息提示

为什么使用断言

确保看起来无法到达的代码实际上是无法到达的
确保假设是正确的
确保 switch case 语句的 default 分支无法到达
检查对象的状态
在方法的开始检验
在方法调用后检验

注意事项

断言主要用于检查逻辑上不可能的情况。例如,它们可用于检查代码在开始运行之前期望的状态或在代码结束运行之后的状态。与普通的异常/错误处理不同,断言通常在运行时被禁用。

在哪里使用断言

私有方法的参数。私有参数仅由开发人员的代码提供,开发人员可能希望检查其关于参数的假设
分支条件,例如 switch case 语句
方法开头的条件

哪里不使用断言

断言不应用于替换错误/异常消息
断言不应用于 public 方法中的参数,因为它们可能由用户提供
断言不应在命令行参数上使用

小结

断言是一种调试方式,断言失败会抛出 AssertionError,只能在开发和测试阶段启用断言
对可恢复的错误不能使用断言,而应该抛出异常
JAVA中断言很少被使用,更好的方法是编写单元测试

作者:河西

服务推荐