2010-08-23 8 views
5

Ich habe den folgenden Code-Snippet, das stört mich verursacht, wo currentRate und secondCurrentRate sind Doppel Objekte, korrekt definiert:Doppel = null verursacht eine Nullpointer

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

Dies sollte sich jeder für null Überprüfen -ness und weisen Sie den Wert entsprechend null zu. Wenn secondCurrentRate jedoch null ist, verursacht dies eine NullPointerException. Ich habe das Snippet dies geändert:

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

Und das funktioniert wie erwartet. Meine Frage ist, warum passiert das? Ich könnte es verstehen, wenn ich eine Methode für die Objekte aufrufen würde, aber mein Verständnis war, dass NullPointerExceptions ausgelöst wurden, wenn eine Methode für ein Null-Objekt aufgerufen wurde. Es gibt ein Null-Objekt, aber es gibt keinen Methodenaufruf.

Kann mir jemand einen Einblick geben? Dies läuft in Java 5.

+0

In Ihrem zweiten Snippet ist es "||" oder "|"? –

+1

@ Thierry-Dimitri Roy es ist das gleiche in diesem Fall. –

+0

Bitte geben Sie ein kurzes, aber vollständiges Programm an, das das Problem aufzeigt. –

Antwort

5

Ich denke, dein Problem ist woanders.

Dies funktioniert:

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

Aber wenn Sie dies getan haben, wird es eine NPE verursachen:

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

0 down vote \t Ich habe gerade dies versucht und während der Compiler nicht erlaubt Doppel a = null; Es wird glücklich, dass Sie doppelt a = 0.0> 1.0 schreiben? a: null; welches kompiliert aber NPE wirft. Das ist das psychische Power-Debugging, das du hier machst ;-) – egbokul

+0

Tatsächlich wird die JVM mit dem ternären Operator null als 'Double' betrachten, dann als Box in ein' double' auflösen und dann abstürzen :) –

1

Der Typ des Bedingungsoperator ist eigentlich quite complicated. Ich glauben, was in Ihrem ersten Beispiel der Fall ist, ist dies: Der zweite Operand des bedingten,

currentRate * secondCurrentRate 

ist vom Typ double, und dies wird auch die Art des gesamten Ausdrucks. Wenn einer der Werte null ist, versucht es dann, den Wert des Ausdrucks auf Double null festzulegen, das in einem double ungepackt ist und eine NPE verursacht.

Der Grund, warum der zweite Ausdruck funktioniert, liegt an der etwas anderen Semantik des Bedingungsausdrucks in diesem Fall.

Verwandte Themen