Boolean sortAsc = Objects.nonNull(chooseRequest) ?
chooseRequest.getSortAsc() : false;
那些代码会抛出NPE异常,为什么?
chooseRequest 是一个 DTO,chooseRequest.getSortAsc() 将返回 null
但是
Boolean sortAsc = Objects.nonNull(chooseRequest) ? null : false;
还可以
我无法理解,JVM是11
当你有这样的表情时
Objects.nonNull(chooseRequest)
? chooseRequest.getSortAsc()
: false
并且
chooseRequest.getSortAsc()
的返回类型定义为 Boolean
,则该(布尔)条件表达式的“结果”将是 boolean
(原始类型),如表 表 15.25-B 所示。条件表达式类型(原始第三个操作数,第二部分):
表 15.25-B。条件表达式类型(原始第三个操作数,第二部分)
第三个→ [...] 布尔值 第二次↓ [...] 布尔值 布尔值
当
chooseRequest.getSortAsc()
返回 null
时,您将得到 NullPointerException
,因为它尝试调用 java.lang.Boolean.booleanValue()
上的 null
方法,将 Boolean
值转换为 boolean
值。
但是,当你有这样的表情
Objects.nonNull(chooseRequest)
? null
: false
那么这个(参考)条件表达式的“结果”将是一个
Boolean
(包装类):
表 15.25-B。条件表达式类型(原始第三个操作数,第二部分)
第三个→ [...] 布尔值 第二次↓ [...] 空 lub(空,布尔值)
(有关
lub()
的定义,请参阅 4.10.4. 最小上界。另请参阅 什么是 lub(null, Double)?)
这里不会抛出
NullPointerException
,因为 null
上没有调用任何方法。
总的来说,
NullPointerException
并不是像您可能怀疑的那样来自对 getSortAsc()
调用 null
方法,而是来自 null
到 boolean
值的转换。有趣的是,如果您将变量从 Boolean sortAsc
更改为 boolean sortAsc
,您的第二个代码块也会抛出 NullPointerException
,因为它尝试在返回的 java.lang.Boolean.booleanValue()
值上调用 null
(假设返回 Objects.nonNull(chooseRequest)
) true
当时)。