2010-08-23 19 views
5

Mam następujący fragment kodu, który jest przyczyną mnie niepokoić, gdzie currentRate i secondCurrentRate są podwójne obiekty, poprawnie zdefiniowane:Podwójne = null powoduje NullPointerException

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

ten powinien sprawdzić każdy każdy Pokój dla wartości null -ness i odpowiednio przypisz wartość zerową. Jednak jeśli parametr secondCurrentRate ma wartość NULL, powoduje to wyjątek NullPointerException. zmieniłem fragment to:

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

I to działa zgodnie z oczekiwaniami. Moje pytanie brzmi: dlaczego tak się dzieje? Mogłem to zrozumieć, gdybym wywoływał jakąś metodę na obiektach, ale zrozumiałem, że wyrzucano NullPointerExceptions, gdy metoda została wywołana na obiekcie zerowym. Istnieje obiekt zerowy, ale nie ma wywołania metody.

Czy ktoś może wnieść w to wgląd? To działa w Javie 5.

+0

W Twoim drugim fragmencie, czy jest to "||" lub "|"? –

+1

@ Thierry-Dimitri Roy to w tym przypadku to samo. –

+0

Proszę podać krótki, ale kompletny program, który demonstruje problem. –

Odpowiedz

5

Myślę, że twój problem jest gdzie indziej.

to działa:

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

Ale jeśli już to zrobisz, będzie to powodować NPE:

Double currentRate=null, secondCurrentRate =null; 
    double test = (currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null; 
+0

0 w dół głosowanie \t Właśnie próbowałem tego i podczas gdy kompilator nie zezwala na podwójne a = null; na szczęście pozwolisz ci napisać podwójnie a = 0,0> 1,0? a: null; który skompiluje, ale wyrzuci NPE. To jest psychiczne debugowanie mocy, które tu robisz ;-) – egbokul

+0

W rzeczywistości z operatorem trójskładnikowym JVM uzna zero za "Double", a następnie rozpakuje je na "podwójne", a następnie zawiesi :) –

1

Rodzaj operatora warunkowego jest faktycznie quite complicated. wierzę co dzieje się w pierwszym przykładzie jest to: Drugi operand z warunkowego,

currentRate * secondCurrentRate 

jest typu double, a to staje się również rodzaj całego wyrażenia. Następnie, gdy jedna z wartości ma wartość NULL, próbuje ustawić wartość wyrażenia na wartość null Double, która jest rozpakowywana do double i powoduje NPE.

Powód, dla którego działa drugie wyrażenie, wynika z nieco innej semantyki wyrażenia warunkowego w tym przypadku.

Powiązane problemy