Alguns dias atrás, encontrei um cenário fascinante em que não encontrava nenhuma documentação sobre como ou por que o Java permite que o seguinte aconteça. (Este trecho é apenas uma forma simplificada do 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);
}
no trecho acima:
se o bool = true, então você obtém o valor '5';
mas se bool = false, você recebe uma exceção de ponteiro nulo ao tentar avaliar a operação ternária. NÃO a declaração de impressão.
Para consertar isso, mudei 'resultado' para
Long result = bool ? Long.valueOf(intVal) : longVal;
Fazer isso dará o comportamento esperado que eu precisava:
se o bool = true, então você obtém o valor '5';
mas se bool = false, você obtém 'null'
agora a parte divertida é que, se você dividir isso em uma instrução if / else normal, o java NÃO permitirá que você compile
longVal = intVal;
mas isso não ocorre através do operador ternário. Então, o que o Java está fazendo para torná-lo nulo no snippet original?
(java 11)