Bitte beachten Sie dieses Code-Snippet:
%Vor% Soweit ich weiß (und was meine IDE mir sagen kann), sollten die Variablen testMin
und verwachtMin
gleichwertig sein.
Wie Sie vielleicht erwarten, schreibe ich lieber die letzten zwei Zeilen als die ersten 7. Wenn ich jedoch drei Nullwerte an diese Methode übergebe, erhalte ich eine NPE bei der Berechnung der verwachtMin
-Variablen.
Weiß jemand, wie das passieren kann? Testet der ternäre Operator den 2. Teil, auch wenn die Bedingung nicht true
?
(Java Version 1.6.0_21)
Versuchen:
%Vor%oder
%Vor% Die Typen der alternativen Seiten des ternären Operators waren double
und Double
, was bedeutet, dass Double
auf double
entpackt wird und dann bei der Zuweisung ein Boxing von double
bis% Code%. Wenn der Wert von Double
min
ist, dann werden die Unboxing-NPEs.
Bewertet der ternäre Operator den 2. Teil, auch wenn die Bedingung vorliegt ist nicht wahr
Nein - aber es bewertet den dritten Teil und ich denke in diesem Fall versucht es min
(führt zur NPE) zu autounieren, weil der Rückgabetyp von Math.max()
primitiv double
ist und den Rückgabetyp der gesamter Ausdruck.
Autoboxing / -unboxing ist vom Teufel.
Das Problem wird verursacht durch autoboxing *, nicht vom ternären Operator. Sie verwenden den Wrapper-Typ Double
anstelle von double
primitiver Typ Weil Math.max()
erwartet double
Parameter, nicht Double
s, es gibt einen unsichtbaren Aufruf von Double#doubleValue()
, bevor die Werte an Math.max()
übergeben werden. Sie können jedoch keine Methode für ein null
-Objekt aufrufen - daher die NullPointerException
.
Warum verwenden Sie Double
anstelle von double
an erster Stelle? Eine primitive Variable (z. B. double
) kann einfach nicht null
sein.
* Nun, Auto-Boxen, in diesem Fall
Das automatische Entpacken verursacht das Problem. Eine ähnliche Frage wurde schon vorher gestellt. Sie sollten double statt double verwenden, um Ihr Problem zu lösen.
Tags und Links java nullpointerexception ternary-operator