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

Java 8 Guava Preconditions throwing NullPointerException while evaluating the exception message string

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

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

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

无论条件是否为真,guava 前置条件都会评估异常消息字符串吗?

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

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

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

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

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

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

您可以通过(例如)破解它:

static void test(Object myObject) {

    Preconditions.checkArgument(
        myObject == null, "This object is not null #%s.", myObject == null ? null : myObject.getId()
    );

}

条件:myObject == null ? myObject : myObject.hashCode()仍然要被评估,总是;但是直到需要时才会计算错误消息本身。