2017-08-28 45 views
0

所以我们假设我想将一个成员变量设置为null。设置一个原始双成员变量为空

MyObject m = new MyObject(); 
m.setMyNumber(null); 

编译错误:无法将null转换为double。
所以我想到了一个窍门。

MyObject m = new MyObject(); 
Double d = null; 
m.setMyNumber(d); 

感觉有点骇人,但编译器没有抛出任何错误。
问题是,如果我调用m.getMyNumber()会发生什么。

+2

它可能会编译,但如果您运行该代码,您将得到NullPointerException,因为基元变量不能设置为null。 – khelwood

+0

只要你使用'Double'包装器对象,它就会返回'null'。 –

+0

根据您告诉我们的情况我们无法回答这个问题。如果我对方法签名做出合理的猜测,我会希望在第二个示例中的'setMyNumber'行出现运行时错误。 –

回答

0

此编译错误消息意味着MyObject包含double myNumber字段而不包含对象:Double myNumber字段。

但是,您不能使用null设置原始变量。只有对象可能被分配到null

Question is, what will happen if I call m.getMyNumber().

你甚至没有时间去调用它。

只要Double d = null; m.setMyNumber(d);将被执行,一个NullPointerException将被抛出null不能unboxeddouble值。

JLS引用了这一点:

5.1.8. Unboxing Conversion

At run time, unboxing conversion proceeds as follows:

...

If r is null, unboxing conversion throws a NullPointerException

0

您的代码会崩溃的运行时间,同时呼吁setMyNumber,因为没有办法null转换为double