使用三目运算符时抛出NullPointerException异常

7

I have the following return statement:

public Boolean foo(String booleanString){  
    return ("true".equals(booleanString) ? true : ("false".equals(booleanString) ? false : null));
}

booleanString既不等于true也不等于false时,我会收到NullPointerException异常。这是装箱/拆箱问题吗?

booleanString有什么价值? - Gnanadurai A
1
是的。我猜它正在尝试将null转换为布尔值。你能发一下方法签名吗? - Venkata Raju
2个回答

8
你猜对了。详细解释见JLS

如果第二个和第三个操作数中有一个是基本类型T,而另一个是将T应用装箱转换(§5.1.7)的结果,则条件表达式的类型为T。

因此,由于在两个表达式中都使用了原始的truefalse,所以条件表达式的类型是boolean
当你进入第二个表达式时,在第二种情况下,空引用将被转换为布尔值null.booleanValue();,导致NPE,因此该表达式等效于:
return Boolean.valueOf(null.booleanValue());

如果表达式的返回类型是Boolean,那么它将被重新封装,但由于你已经猜到了,现在为时已晚。

例如:

return ("true".equals(booleanString) ? Boolean.TRUE : ("false".equals(booleanString) ? Boolean.FALSE : null));

表达式的类型为Boolean,因此不会引发空指针异常(NPE)。然而,这也意味着

return ("true".equals(booleanString) ? true : ("false".equals(booleanString) ? Boolean.FALSE : null));

这是因为同样的规则适用于原始的boolean类型(因为第一个表达式是原始类型)。因此,它相当于:

return Boolean.valueOf(("true".equals(booleanString) ? true : ("false".equals(booleanString) ? Boolean.FALSE : null).booleanValue());

0

由于您返回了对象类型Boolean,因此Java尝试将返回值null拆箱为逻辑表达式中的boolean原始类型,在其中使用了foo()。然后您会得到空指针异常。

这里有一个类似的案例和我的解释:https://stackoverflow.com/a/30055584/784540


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