使用三元运算符时会抛出NullPointerException

gstackoverflow

我有以下返回语句:

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

booleanString等于没有true,而不是false我得到的NullPointerException

是装箱/拆箱问题吗?

亚历克西斯C.

你猜对了。对于正式解释,答案在于JLS

如果第二个操作数和第三个操作数之一是原始类型T,而另一个操作数的类型是将装箱转换(第5.1.7节)应用于T的结果,则条件表达式的类型为T。

所以,当你有原始truefalse在两个表达式,你的条件表达式的类型boolean

当您进入第二个表达式时,在第二种情况下,空引用将通过转换为布尔值null.booleanValue();,从而导致NPE,因此该表达式等效于:

return Boolean.valueOf(null.booleanValue());

(然后将表达式的返回类型重新装箱到Boolean,但为时已晚)。

例如:

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

因为表达式的类型是,所以不会引起NPE Boolean但是,这

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());

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章