当我使用三元运算符时抛出NullPointerException

时间:2015-05-06 13:58:58

标签: java boolean ternary-operator boxing unboxing

我有以下退货声明:

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

booleanString等于true而不是false时,我得到了NullPointerException

是装箱/拆箱问题吗?

2 个答案:

答案 0 :(得分:7)

你猜对了。对于正式的解释,答案在于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());

答案 1 :(得分:0)

当您返回对象类型Boolean时,java会尝试将值{un}返回值null转换为逻辑表达式中的boolean基元类型,其中foo()一直在使用。你得到Null Pointer Exception。

以下是类似案例和我的解释:https://stackoverflow.com/a/30055584/784540