据我所知,以下代码不应抛出Null Pointer exception
,因为我正在安全地使用Optional接口。
但是,当我运行这段代码时,它会抛出NPE
。
public class Test {
public static void main(String[] args) {
final Integer inte = false ? 0 : Optional.ofNullable((Integer) null).orElse(null);
}
}
请让我知道我是否在代码中的某个地方弄错了,并帮助我对其进行更正。
得到NullPointerException的原因是,表达式false ? 0 : Optional.ofNullable((Integer) null).orElse(null)
的类型为int
(根据表15.25-C的JLS表示。]
表达式Optional.ofNullable((Integer) null).orElse(null)
的计算结果为null
,而将null
强制转换为int
会导致NullPointerException。
当然,您会得到一个NullPointerException,因为您的右手只是表达null
的一种非常详尽的方式。您将null
包裹在Optional
中,从而强制执行的orElse
为null
。为int
变量分配null将为您提供NullPointerException
。
仅将null
包装在Optional
中仍会在再次展开包装时为您提供null
。
我找到了解决方法
final Integer inte = false ? (Integer)0 : Optional.<Integer>ofNullable(null).orElse(null);
或
final Integer inte = false ? (Integer)0 : Optional.ofNullable((Integer)null).orElse(null);
三元运算符返回的类型应为int(因为文字为0)。