NPE:无法拆箱空值

问题描述 投票:0回答:1
Boolean sortAsc = Objects.nonNull(chooseRequest) ?
       chooseRequest.getSortAsc() : false;

那些代码会抛出NPE异常,为什么?

chooseRequest 是一个 DTO,chooseRequest.getSortAsc() 将返回 null

但是

Boolean sortAsc = Objects.nonNull(chooseRequest) ? null : false;

还可以

我无法理解,JVM是11

java nullpointerexception
1个回答
0
投票

当你有这样的表情时

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
当时)。

© www.soinside.com 2019 - 2024. All rights reserved.