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 次 |
最近记录: |