我有以下返回语句:
public Boolean foo(String booleanString){
return ("true".equals(booleanString) ? true : ("false".equals(booleanString) ? false : null));
}
当booleanString
等于没有true
,而不是false
我得到的NullPointerException
。
是装箱/拆箱问题吗?
你猜对了。对于正式解释,答案在于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());
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句