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

gst*_*low 7 java boxing unboxing boolean ternary-operator

我有以下退货声明:

public Boolean foo(String booleanString){  
    return ("true".equals(booleanString) ? true : ("false".equals(booleanString) ? false : null));
}
Run Code Online (Sandbox Code Playgroud)

如果booleanString不相等true而不是false我得到了NullPointerException.

是拳击/拆箱问题吗?

Ale*_* C. 8

你猜对了.对于正式的解释,答案在于JLS:

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

因此,当您具有原语时true,false在两个表达式中,条件表达式的类型都是boolean.

当你进入第二个表达式时,在第二个表达式中,null引用被转换为boolean with null.booleanValue();,导致NPE,因此表达式等效于:

return Boolean.valueOf(null.booleanValue());
Run Code Online (Sandbox Code Playgroud)

(然后表达式的返回类型被重新加载Boolean,但是你猜对了,为时已晚).

例如:

return ("true".equals(booleanString) ? Boolean.TRUE : ("false".equals(booleanString) ? Boolean.FALSE : null));
Run Code Online (Sandbox Code Playgroud)

因为表达式的类型是,所以不会导致NPE Boolean.然而,这,

return ("true".equals(booleanString) ? true : ("false".equals(booleanString) ? Boolean.FALSE : null));
Run Code Online (Sandbox Code Playgroud)

导致它,因为同样适用相同的规则(因为第一个表达式是基本boolean类型).所以它相当于:

return Boolean.valueOf(("true".equals(booleanString) ? true : ("false".equals(booleanString) ? Boolean.FALSE : null).booleanValue());
Run Code Online (Sandbox Code Playgroud)