2010-08-23 91 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。

第二個表達式工作的原因是由於在這種情況下條件表達式的語義略有不同。

相關問題