Java 8 Guava Preconditions 在评估异常消息字符串时抛出 NullPointerException

Mar*_*olo 3 preconditions guava java-8

我有一个对象 myObject 并且我想确保它为空,否则我想用该对象的 id 打印一条自定义消息。我有以下代码行试图实现相同的

Preconditions.checkArgument(Objects.isNull(myObject),
                        "This object is not null #%s.", myObject.getId());
Run Code Online (Sandbox Code Playgroud)

当 myObject 不为空时,此条件工作正常。它抛出适当的异常消息。但是当对象确实为空时,我期望其余的代码将被执行,但由于 myObject.getId() 调用,我得到了一个空指针异常。

无论条件是否为真,番石榴前提条件都会评估异常消息字符串吗?

glg*_*lgl 5

Preconditions.checkArgument(Objects.isNull(myObject),
                    "This object is not null #%s.", myObject.getId());
Run Code Online (Sandbox Code Playgroud)

你必须看看发生了什么顺序:

在任何调用checkArgument()可以发生之前,它的所有参数都会被评估:

  • Objects.isNull(myObject)
  • 字符串
  • myObject.getId()

只有这样调用才能发生,如果在此评估期间发生异常,则调用不会首先发生。

只是为了完整性,正如在其他地方已经提到的那样:要走的路是myObject == null ? null: myObject.getId(),因为它避免了在null对象的情况下取消引用。