java: seltsame NullPointerException im ternären Operator (?:)

8

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 ?

ist?

(Java Version 1.6.0_21)

    
geronimo 09.03.2011, 13:55
quelle

5 Antworten

14

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.

    
Tom Hawtin - tackline 09.03.2011, 13:58
quelle
3
  

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.

    
Michael Borgwardt 09.03.2011 14:00
quelle
1

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

    
Matt Ball 09.03.2011 14:02
quelle
0

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.

    
Gursel Koca 09.03.2011 13:58
quelle
0

Math.max(min, avg - 3 * sd) here min , avg und sd werden von Double doubled, was zu einem Double führt, wenn einer von ihnen null ist, verursacht eine NPE.

    
Thomas 09.03.2011 14:03
quelle