Java Auto Boxen / Unboxing Wierdness [Duplizieren]

8
  

Mögliche Duplikate:
Boolesche Werte, bedingte Operatoren und Autoboxing
Java, Google Collections Library; Problem mit AbstractIterator?

Der folgende Code erzeugt eine NPE:

%Vor%

Um "null" ohne eine Ausnahme korrekt auszudrucken, benötigt dieser Code:

%Vor%

Es ist offensichtlich im ersten Beispiel, dass "test" entpackt (in native int konvertiert) wird, aber warum? Und warum behebt das Ändern des anderen Ausdrucks im ternären Operator (wie im zweiten Beispiel) das Problem? Kann irgendjemand irgendeine Art von Erzählung liefern, wann genau was, warum und warum Zeug in beiden Beispielen gepackt und ungepackt ist?

    
GreenieMeanie 28.10.2010, 17:45
quelle

1 Antwort

18

Aus Abschnitt 15.25 der Java-Sprachspezifikation :

  

Der Typ eines bedingten Ausdrucks wird wie folgt bestimmt:

     
  • Wenn der zweite und der dritte Operand den gleichen Typ haben (was der Null-Typ sein kann), dann ist das der Typ des bedingten Ausdrucks.      
    • Wenn einer der zweiten und dritten Operanden vom Typ boolean ist und der Typ des anderen vom Typ Boolean, dann ist der Typ des bedingten Ausdrucks boolean.
    •   
    • Wenn einer der zweiten und dritten Operanden vom Nulltyp ist und der Typ des anderen Operanden ein Referenztyp ist, dann ist der Typ des Bedingungsausdrucks dieser Referenztyp.
    •   
    • Wenn der zweite und der dritte Operand konvertierbare Typen (§5.1.8) in numerische Typen haben, gibt es mehrere Fälle:      
      • Wenn einer der Operanden vom Typ Byte oder Byte ist und der andere vom Typ short oder Short, dann ist der Typ des bedingten Ausdrucks kurz.
      •   
      • Wenn einer der Operanden vom Typ T ist, wobei T Byte, kurz oder char ist und der andere Operand ein konstanter Ausdruck vom Typ int ist, dessen Wert im Typ T darstellbar ist, dann ist der Typ des bedingten Ausdrucks T .
      •   
      • Wenn einer der Operanden vom Typ Byte ist und der andere Operand ein konstanter Ausdruck vom Typ int ist, dessen Wert im Typ Byte darstellbar ist, dann ist der Typ des Bedingungsausdrucks byte.
      •   
      • Wenn einer der Operanden vom Typ Short ist und der andere Operand ein konstanter Ausdruck vom Typ int ist, dessen Wert im Typ short darstellbar ist, dann ist der Typ des bedingten Ausdrucks kurz.
      •   
      • Wenn einer der Operanden vom Typ ist; Character und der andere Operand ist ein konstanter Ausdruck vom Typ int, dessen Wert im Typ char dargestellt werden kann, dann ist der Typ des bedingten Ausdrucks char.
      •   
      • Andernfalls wird die binäre numerische Heraufstufung (§5.6.2) auf die Operandentypen angewendet, und der Typ des bedingten Ausdrucks ist der hochgestufte Typ des zweiten und dritten Operanden. Beachten Sie, dass die binäre numerische Heraufstufung die Unboxing-Konvertierung (§5.1.8) und die Wertsatzkonvertierung (§5.1.13) ausführt.
      •   
    •   
  •   

Es folgt also das letzte Bullet, das eine binäre numerische Promotion ausführt, die eine Unboxing-Konvertierung durchführt. Der Typ des bedingten Operatorausdrucks ist int , obwohl Sie ihn einem Integer zuweisen. Es versucht, die Unboxing-Konvertierung für null durchzuführen, daher die Ausnahme.

    
Jon Skeet 28.10.2010, 17:51
quelle

Tags und Links