Quando scrivo il mio codice Java come questo:strano comportamento quando si utilizza Java operatore ternario
Map<String, Long> map = new HashMap<>()
Long number =null;
if(map == null)
number = (long) 0;
else
number = map.get("non-existent key");
l'applicazione funziona come previsto, ma quando faccio questo:
Map<String, Long> map = new HashMap<>();
Long number= (map == null) ? (long)0 : map.get("non-existent key");
ho un NullPointerException sul seconda linea. Il puntatore di debug passa dalla seconda linea a questo metodo nella classe java.lang.Thread:
/**
* Dispatch an uncaught exception to the handler. This method is
* intended to be called only by the JVM.
*/
private void dispatchUncaughtException(Throwable e) {
getUncaughtExceptionHandler().uncaughtException(this, e);
}
Cosa sta succedendo qui? Entrambi questi percorsi di codice sono esattamente equivalenti, vero?
Modifica
Sto usando Java 1.7 U25
Perché stai provando per l'impossibile? Crei tu stesso la 'mappa '; se è 'null', il tuo sistema runtime è rotto. Dato che questa è ovviamente una versione abbreviata di altri lavori che stai facendo, ti suggerisco di assicurarti che gli oggetti siano sempre inizializzati, quindi non devi fare i controlli 'map == null'. Le chiavi sono il tuo problema. –
@Eric Jablow Questa è solo una versione semplificata del mio codice. La mappa in questione viene effettivamente recuperata da un altro luogo in cui vengono creati dinamicamente su richiesta. Ecco perché il controllo. Qui ho incluso l'inizializzazione in modo che sia chiaro alle persone che stanno rispondendo che il caso if-true non viene eseguito quando il mio problema si verifica – radiantRazor
Ora capisco. Probabilmente la cosa migliore sarebbe lanciare un'eccezione immediatamente se qualcuno dovesse passare una mappa 'nullo' al tuo codice. Oppure, se qualcuno passa in un 'nullo' al tuo codice, imposta la tua mappa su uno vuoto. –