2010-08-23 83 views
5

我有下面的代码片段,是造成我烦,其中currentRate和secondCurrentRate是双对象,正确定义:双= NULL导致一个NullPointerException

(currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null; 

这应该检查每个每个双人间空并且相应地赋值null。但是,如果secondCurrentRate为null,则会导致NullPointerException。 我已经改变了段将:

(currentRate == null | secondCurrentRate == null) ? null : currentRate * secondCurrentRate; 

而这按预期工作。我的问题是为什么会发生这种情况?我可以理解,如果我在对象上调用某种方法,但是我的理解是在空对象上调用方法时引发了NullPointerExceptions。有一个空对象,但没有方法调用。

任何人都可以提供任何见解吗?这是运行在Java 5中。

+0

在你的第二个片段中,它是“||”或“|”? – 2010-08-23 13:11:24

+1

@ Thierry-Dimitri Roy在这种情况下是一样的。 – 2010-08-23 13:12:54

+0

请提供一个简短但完整的程序来说明问题。 – 2010-08-23 13:13:02

回答

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; 
+0

0回复 \t 我刚刚试过这个,而编译器不允许double a = null;它会很高兴地让你写出double a = 0.0> 1.0? a:null;这将编译,但抛出NPE。这是调试你在这里做的心理能力;-) – egbokul 2010-08-23 13:21:10

+0

事实上,对于三元运算符,JVM将认为null为“Double”,然后将其解包为“double”,然后崩溃:) – 2010-08-23 13:22:37

1

类型条件运算实际上是quite complicated。我相信什么在你的第一个例子发生,是这样的:在有条件的第二个操作数,

currentRate * secondCurrentRate 

double型的,而这也成为了整个表达式的类型。然后,当其中任何一个值都为空时,它会尝试将表达式的值设置为Double空值,该空值被拆箱到double中并导致NPE。

第二个表达式工作的原因是由于在这种情况下条件表达式的语义略有不同。

相关问题