我有以下退货声明:
public Boolean foo(String booleanString){
return ("true".equals(booleanString) ? true : ("false".equals(booleanString) ? false : null));
}
当booleanString
等于true
而不是false
时,我得到了NullPointerException
。
是装箱/拆箱问题吗?
答案 0 :(得分:7)
你猜对了。对于正式的解释,答案在于JLS:
如果第二个和第三个操作数之一是原始类型T,和 另一种的类型是应用拳击转换的结果 (§5.1.7)到T,那么条件表达式的类型是T.
因此,在两个表达式中都有原始true
和false
,条件表达式的类型为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