为什么短路 IF 会导致 NullPointerException 错误发生

11

我编写了一段短小的Java代码,导致出现NullPointerException异常。有没有人能解释这是为什么?代码:

int val = 2;
Boolean result = (val == 0) ? false : ((val == 1) ? true : null);

以下是简化版本代码,也会导致空指针异常:

Object result = (false) ? false : (false ? true : null);

但是这个:

int val = 2;
Boolean result = (val == 0) ? Boolean.FALSE : ((val == 1) ? true : null);

以及这个:

Object result = (false) ? Boolean.FALSE : (false ? true : null);

或者这样:
Object result = (false) ? (Boolean)false : (false ? true: null);

不是吗?


2
((val == 1) ? true : null) 这里把 null 改成 false - noMAD
使用boolean而不是Boolean可以避免许多空指针异常。 - AllTooSir
@TheNewIdiot 对于这种情况没有影响。 - Daniel Kaplan
很可能是 null.booleanValue() 导致了 NPE。 - AllTooSir
@TheNewIdiot 我想在布尔类型中有三个值:true、false 和 null 用于错误检测。 - Jokii
3个回答

4
我认为发生的情况是((val == 1) ? true : null)总是返回null,然后试图将其解封装为boolean。这会导致空指针异常。
在我说完这句话之后,@JonSkeet将您的问题标记为重复,因为NullPointerException in ternary expression with null Long中的答案有更详细的解释。

所以为什么在示例中将false更改为Boolean.FALSE会修复NPE问题? - Jokii

0

int val = 2;

boolean result = (val == 0) ? false : true; // 将代码中的 null 替换为 true。


-1
在Java中,boolean 只允许 truefalse,但 Boolean 允许 truefalseNULL

1
那么,NPE的原因是什么? - sanbhat
1
哦,糟糕了,我希望这应该是一条评论,而不是一个回答。@___@ - noMAD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接