Domanda

  

possibili duplicati:
   booleani, operatori condizionali e autoboxing
   Java, Google Collezioni Biblioteca; problema con AbstractIterator?

Il codice sotto produce un NPE:

Integer test = null;
Integer test2 = true ? test : 0;
System.out.println(test2);

Per stampare correttamente "nullo", senza eccezione richiede questo codice:

Integer test = null;
Integer test2 = true ? test : (Integer)0;
System.out.println(test2);

E 'evidente nel primo esempio che "test" viene unboxing (convertito in int nativo), ma perché? E perché non cambiare l'altra espressione nel operatore ternario (come nel secondo esempio) risolvere il problema? Qualcuno può dare una sorta di racconto di esattamente quando, cosa e perché roba in entrambi gli esempi viene confezionato e unboxed?

È stato utile?

Soluzione

sezione 15.25 del linguaggio Java Specification :

  

Il tipo di un'espressione condizionale è determinato come segue:

     
      
  • Se il secondo e terzo operandi hanno lo stesso tipo (che può essere il tipo nullo), allora questo è il tipo dell'espressione condizionale.      
        
    • Se uno dei secondi e terzi operandi è di tipo boolean e il tipo di l'altro è di tipo booleano, allora il tipo dell'espressione condizionale è booleana.
    •   
    • Se uno dei secondi e terzi operandi è di tipo nullo e il tipo di l'altro è un tipo di riferimento, allora il tipo dell'espressione condizionale è che tipo di riferimento.
    •   
    • In caso contrario, se il secondo e terzo operandi hanno tipi convertibili (§5.1.8) per tipi numerici, allora ci sono diversi casi:      
          
      • Se uno degli operandi è di tipo byte o byte e l'altro è di tipo corto o corti, allora il tipo dell'espressione condizionale è breve.
      •   
      • Se uno degli operandi è di tipo T, dove T è byte, short, o char, e l'altro operando è una costante espressione di tipo int cui valore è rappresentabile nel tipo T, allora il tipo dell'espressione condizionale è T .
      •   
      • Se uno degli operandi è di tipo byte e l'altro operando è una costante espressione di tipo int cui valore è rappresentabile in caratteri byte, allora il tipo dell'espressione condizionale è byte.
      •   
      • Se uno degli operandi è di tipo corto e l'altro operando è una costante espressione di tipo int cui valore è rappresentabile nel tipo corto, allora il tipo dell'espressione condizionale è breve.
      •   
      • Se uno degli operandi è di tipo; Carattere e l'altro operando è un'espressione costante di tipo int cui valore è rappresentabile nel tipo char, allora il tipo dell'espressione condizionale è char.
      •   
      • Altrimenti, promozione numerico binario (§5.6.2) viene applicata ai tipi di operando, e il tipo dell'espressione condizionale è il tipo promosso di secondo e terzo operandi. Si noti che esegue binari di promozione numerici conversione unboxing (§5.1.8) e la conversione valore impostato (§5.1.13).
      •   
    •   
  •   

Quindi è seguito il proiettile finale, eseguendo la promozione numerico binario, che esegue una conversione unboxing. Così il tipo dell'espressione operatore condizionale è int, anche se si sta assegnando a un Integer. Si sta cercando di eseguire la conversione unboxing su null, da qui l'eccezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top