Несколько дней назад я столкнулся с увлекательным сценарием, в котором я не смог найти никакой документации о том, как или почему Java допускает следующее. (Этот фрагмент - просто упрощенная форма ошибки.)
@Test
public void test() {
boolean bool = false;
Integer intVal = Integer.valueOf(5);
Long longVal = null;
Long result = bool ? intVal : longVal;
System.out.println(" > " + result);
}
во фрагменте выше:
если bool = true, тогда вы получите значение '5';
но если bool = false, то при попытке оценить троичную операцию вы получите исключение нулевого указателя. НЕ заявление печати.
Чтобы это исправить, я просто изменяю «результат» на
Long result = bool ? Long.valueOf(intVal) : longVal;
Это даст ожидаемое поведение, которое мне нужно:
если bool = true, тогда вы получите значение '5';
но если bool = false, тогда вы получите 'null'
теперь самое интересное в том, что если вы разделите это на обычный оператор if / else, то java НЕ позволит вам скомпилировать
longVal = intVal;
но это не ловит это через троичный оператор. Так что же делает Java, чтобы сделать ее нулевой точкой в исходном фрагменте?
(Ява 11)