Using Java Assertions – 使用Java断言

最后修改: 2018年 5月 1日

中文/混合/英文(键盘快捷键:t)

1. Introduction

1.介绍

The Java assert keyword allows developers to quickly verify certain assumptions or state of a program.

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

In this article, we’ll take a look at how to use the Java assert keyword.

在这篇文章中,我们将看看如何使用Java的assert关键字。

2. History of Java Assertions

2.Java断言的历史

The Java assert keyword was introduced in Java 1.4, so it’s been around for quite a while. However, it remains a little-known keyword that can drastically reduce boilerplate and make our code more readable.

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

For example, often times in our code we need to verify certain conditions that might prevent our application from working properly. Typically we’d write something like this:

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

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

Using assertions we can remove the if and throw statement with a single assert statement.

使用断言,我们可以用一条assert语句来移除ifthrow语句。

3. Enabling Java Assertions

3.启用Java断言

Because Java assertions use the assert keyword, there are no libraries needed or packages to import.

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

Note that prior to Java 1.4 it was perfectly legal to use the word “assert” for naming variables, methods, etc. This potentially creates a naming clash when using an older code with newer JVM versions.

请注意,在Java 1.4之前,使用 “assert “一词来命名变量、方法等是完全合法的。当使用较早的代码和较新的JVM版本时,这有可能造成命名上的冲突。

Therefore, for backward compatibility, the JVM disables assertion validation by default. They must be explicitly enabled using either the -enableassertions command line argument, or its shorthand -ea:

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

java -ea com.baeldung.assertion.Assertion

In this example, we’ve enabled assertions for all classes.

在这个例子中,我们已经为所有的类启用了断言。

We can also enable assertions for specific packages and classes:

我们还可以为特定的包和类启用断言。

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

Here, we’ve enabled assertions for all the classes in the com.baeldung.assertion package.

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

Likewise, they can be disabled for specific packages and classes using the -disableassertions command line argument, or its shorthand -da. We can also use all four of these arguments together.

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

4. Using Java Assertions

4.使用Java断言

To add assertions, simply use the assert keyword and give it a boolean condition:

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

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

Java also provides a second syntax for assertions that takes a string, which will be used to construct the AssertionError if one is thrown:

Java还为断言提供了第二种语法,它需要一个字符串,如果抛出了一个字符串,它将被用来构造AssertionError

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

In both cases, the code is checking that a connection to an external resource returns a non-null value. If that value is null, the JVM will automatically throw an AssertionError.

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

In the second case, the exception will have the additional detail that will show up in the stack trace and can aid in debugging the problem.

在第二种情况下,异常会有额外的细节,会在堆栈跟踪中显示出来,可以帮助调试问题。

Let’s have a look at the result of running our class with assertions enabled:

让我们看看启用断言后运行我们的类的结果。

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

5. Handling an AssertionError

5 处理一个AssertionError

The class AssertionError extends Error, which itself extends Throwable. This means that AssertionError is an unchecked exception.

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

Therefore methods that use assertions are not required to declare them, and further calling code should not try and catch them.

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

AssertionErrors are meant to indicate unrecoverable conditions in an application, so never try to handle them or attempt recovery.

AssertionErrors旨在指示应用程序中不可恢复的条件,所以千万不要试图处理它们或尝试恢复。

6. Best Practices

6.最佳实践

The most important thing to remember about assertions is that they can be disabled, so never assume they’ll be executed.

关于断言最重要的一点是,它们可以被禁用,所以永远不要假设它们会被执行

Therefore keep the followings things in mind when using assertions:

因此,在使用断言时要记住以下事项。

  • Always check for null values and empty Optionals where appropriate
  • Avoid using assertions to check inputs into a public method and instead use an unchecked exception such as IllegalArgumentException or NullPointerException
  • Don’t call methods in assertion conditions and instead assign the result of the method to a local variable and use that variable with assert
  • Assertions are great for places in the code that will never be executed, such as the default case of a switch statement or after a loop that never finishes

7. Conclusion

7.结论

The Java assert keyword has been available for many years but remains a little-known feature of the language. It can help remove lots of boilerplate code, make the code more readable, and help identify bugs early in program development.

Java的assert关键字已经存在多年,但仍然是该语言中鲜为人知的特性。它可以帮助删除大量的模板代码,使代码更具可读性,并有助于在程序开发的早期识别错误。

Just remember that assertions aren’t enabled by default, so never assume they will be executed when used in the code.

只要记住,断言在默认情况下是不启用的,所以千万不要认为在代码中使用断言时它们会被执行。

As always, the full source code is available over on GitHub.

一如既往,完整的源代码可在GitHub上获得