Contents

Java assert 简介

1. 简介

Java assert关键字允许开发人员快速验证程序的某些假设或状态。

在本文中,我们将了解如何使用 Java assert关键字。

2. Java 断言的历史

Java assert关键字是在 Java 1.4 中引入的,所以它已经存在了很长一段时间。然而,它仍然是一个鲜为人知的关键字,它可以大大减少样板文件并使我们的代码更具可读性。

例如,在我们的代码中,我们经常需要验证某些可能会阻止我们的应用程序正常工作的条件。通常我们会这样写:

Connection conn = getConnection();
if(conn == null) {
    throw new RuntimeException("Connection is null");
}

使用断言,我们可以使用单个assert语句删除ifthrow语句。

3. 启用 Java 断言

因为 Java 断言使用assert关键字,所以不需要导入任何库或包。

请注意,在 Java 1.4 之前,使用“断言”一词来命名变量、方法等是完全合法的。当使用较旧的代码和较新的 JVM 版本时,这可能会产生命名冲突。

因此,为了向后兼容,JVM 默认禁用断言验证。必须使用*-enableassertions命令行参数或其简写-ea* 显式启用它们:

java -ea com.blogdemo.assertion.Assertion

在此示例中,我们为所有类启用了断言。 我们还可以为特定的包和类启用断言:

java -ea:com.blogdemo.assertion... com.blogdemo.assertion.Assertion

在这里,我们为com.blogdemo.assertion包中的所有类启用了断言。

同样,可以使用 -disableassertions 命令行参数或其简写 -da 为特定的包和类禁用它们。我们也可以一起使用所有这四个参数。

4. 使用 Java 断言

要添加断言,只需使用assert关键字并给它一个boolean条件

public void setup() {
    Connection conn = getConnection();
    assert conn != null;
}

Java 还为接受字符串的断言提供了第二种语法,如果抛出一个字符串,它将用于构造AssertionError

public void setup() {
    Connection conn = getConnection();
    assert conn != null : "Connection is null";
}

在这两种情况下,代码都会检查与外部资源的连接是否返回非空值。如果该值为null,JVM 将自动抛出AssertionError

在第二种情况下,异常将具有将显示在堆栈跟踪中并有助于调试问题的其他详细信息。

让我们看看在启用断言的情况下运行我们的类的结果:

Exception in thread "main" java.lang.AssertionError: Connection is null
        at com.blogdemo.assertion.Assertion.setup(Assertion.java:15)
        at com.blogdemo.assertion.Assertion.main(Assertion.java:10)

5. 处理 AssertionError

AssertionError类扩展了Error,它本身扩展了Throwable。这意味着AssertionError是一个未经检查的异常。

因此使用断言的方法不需要声明它们,并且进一步调用代码不应该尝试捕获它们。

AssertionErrors旨在指示应用程序中不可恢复的条件,因此切勿尝试处理它们或尝试恢复。

6. 最佳实践

关于断言要记住的最重要的事情是它们可以被禁用,所以永远不要假设它们会被执行。 因此,在使用断言时请记住以下几点:

  • 在适当的情况下始终检查空值和空选项
  • 避免使用断言来检查公共方法的输入,而是使用未经检查的异常,例如IllegalArgumentExceptionNullPointerException
  • 不要在断言条件下调用方法,而是将方法的结果分配给局部变量并将该变量与assert一起使用
  • 断言非常适合代码中永远不会执行的地方,例如switch语句的默认情况或永远不会完成的循环之后