2017-08-28 76 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