Java auto boxing / unboxing wierdness [duplicato]
-
27-09-2019 - |
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?
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.