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.
是拳击/拆箱问题吗?
你猜对了.对于正式的解释,答案在于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)
| 归档时间: |
|
| 查看次数: |
812 次 |
| 最近记录: |