Qualche giorno fa, mi sono imbattuto in uno scenario affascinante che non riuscivo a trovare alcuna documentazione su come o perché Java permettesse quanto segue. (Questo frammento è solo una forma semplificata del bug.)
@Test
public void test() {
boolean bool = false;
Integer intVal = Integer.valueOf(5);
Long longVal = null;
Long result = bool ? intVal : longVal;
System.out.println(" > " + result);
}
nello snippet sopra:
se bool = true, otterrai il valore '5';
ma se bool = false, si ottiene un'eccezione puntatore null quando si tenta di valutare l'operazione ternaria. NON la dichiarazione di stampa.
Per risolvere questo problema, cambio semplicemente 'risultato' in
Long result = bool ? Long.valueOf(intVal) : longVal;
In questo modo, fornirò il comportamento previsto di cui avevo bisogno:
se bool = true, otterrai il valore '5';
ma se bool = false, allora ottieni 'null'
ora la parte divertente è che se lo dividi in una normale istruzione if / else, allora java NON ti consente di compilare
longVal = intVal;
ma non lo rileva tramite l'operatore ternario. Quindi cosa sta facendo Java per renderlo nullo nello snippet originale?
(java 11)