我有以下代码片段让我烦恼,其中currentRate和secondCurrentRate是Double对象,正确定义:
(currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null;
这应该检查每个Double的null-ness并相应地赋值null。但是,如果secondCurrentRate为null,则会导致NullPointerException。 我已将代码段更改为:
(currentRate == null | secondCurrentRate == null) ? null : currentRate * secondCurrentRate;
这可以按预期工作。我的问题是为什么会发生这种情况?如果我在对象上调用某个方法,我可以理解它,但我的理解是当在null对象上调用方法时抛出NullPointerExceptions。有一个null对象,但没有方法调用。
任何人都可以对此提供任何见解吗?这是在Java 5中运行的。
答案 0 :(得分:5)
我认为你的问题在其他地方。
这有效:
Double currentRate=null, secondCurrentRate =null;
Double test = (currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null;
但是如果你这样做了,它会导致NPE:
Double currentRate=null, secondCurrentRate =null;
double test = (currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null;
答案 1 :(得分:1)
条件运算符的类型实际上是quite complicated。我相信你的第一个例子中发生了什么,是这样的:条件的第二个操作数,
currentRate * secondCurrentRate
的类型为double
,这也是整个表达式的类型。然后,当其中任何一个值为null时,它会尝试将表达式的值设置为Double
null,将其取消装入double
并导致NPE。
第二个表达式起作用的原因是由于在这种情况下条件表达式的语义略有不同。