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语句删除if和throw语句。
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. 最佳实践
关于断言要记住的最重要的事情是它们可以被禁用,所以永远不要假设它们会被执行。 因此,在使用断言时请记住以下几点:
- 在适当的情况下始终检查空值和空选项
- 避免使用断言来检查公共方法的输入,而是使用未经检查的异常,例如IllegalArgumentException或NullPointerException
- 不要在断言条件下调用方法,而是将方法的结果分配给局部变量并将该变量与assert一起使用
- 断言非常适合代码中永远不会执行的地方,例如switch语句的默认情况或永远不会完成的循环之后