Dieser Code funktioniert gut: -
Integer nullInt = null;
if (1 <= 3) {
Integer secondNull = nullInt;
} else {
Integer secondNull = -1;
}
System.out.println("done");
Dies löst jedoch eine Nullzeigerausnahme aus, während Eclipse warnt, dass ein automatisches Entpacken erforderlich ist: -
Integer nullInt = null;
Integer secondNull = 1 <= 3 ? nullInt : -1;
System.out.println("done");
Warum ist das so, kann jemand bitte führen?
java
if-statement
conditional-operator
91StarSky
quelle
quelle
Ich bin mir ziemlich sicher, dass Argumente für ternäre Operatoren vom gleichen Typ sein müssen. Da Sie -1 und einen konstanten
nullint
Compiler verwenden, versuchen Sie, die Boxnullint
zu entpacken , um einen Wert zu erhalten. Und dann Autobox es insecondNull
Variable zu speichern .quelle
Dies liegt daran
? :
, dass eine Unboxing-Konvertierung durchgeführt wird, wenn die beiden Operanden für den bedingten Operator ein primitiver Typ und sein Boxed-Referenztyp sind ( JLS §15.25.2 ):Im Allgemeinen behält das Ersetzen einer
if
Anweisung durch einen? :
Ausdruck nicht immer die Bedeutung des Codes bei, da der? :
Ausdruck selbst einen Typ zur Kompilierungszeit haben muss. Das heißt, wenn die Typen der beiden Operanden unterschiedlich sind, muss eine Konvertierung in einen oder beide durchgeführt werden, damit das Ergebnis einen konsistenten Typ zur Kompilierungszeit hat.quelle
Dieser hat funktioniert (in Java 1.8):
quelle