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()
仍然要被评估,总是;但是直到需要时才会计算错误消息本身。
我有一个对象 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()
仍然要被评估,总是;但是直到需要时才会计算错误消息本身。