Il y a quelques jours, je suis tombé sur un scénario fascinant où je n'ai trouvé aucune documentation sur comment ou pourquoi Java laisse les choses se produire. (Cet extrait n'est qu'une forme simplifiée du bogue.)
@Test
public void test() {
boolean bool = false;
Integer intVal = Integer.valueOf(5);
Long longVal = null;
Long result = bool ? intVal : longVal;
System.out.println(" > " + result);
}
dans l'extrait ci-dessus:
si le bool = true, alors vous obtenez la valeur '5';
mais si bool = false, vous obtenez une exception de pointeur nul lorsque vous essayez d'évaluer l'opération ternaire. PAS la déclaration imprimée.
Pour résoudre ce problème, je change simplement «résultat» en
Long result = bool ? Long.valueOf(intVal) : longVal;
Faire cela donnera le comportement attendu dont j'avais besoin:
si le bool = true, alors vous obtenez la valeur '5';
mais si bool = false, alors vous obtenez 'null'
maintenant la partie amusante est que si vous le divisez en une instruction if / else normale, alors java ne vous permet PAS de compiler
longVal = intVal;
mais il n'attrape pas cela via l'opérateur ternaire. Alors, que fait Java pour en faire un point nul dans l'extrait d'origine?
(java 11)