NullPointerException через авто-бокс-поведение тернарного оператора Java
Я наткнулся на действительно странноеNullPointerException
на днях вызвано неожиданным приведением типа в троичный оператор. Учитывая эту (бесполезную примерную) функцию:
Integer getNumber() {
return null;
}
Я ожидал, что следующие два сегмента кода будут полностью идентичны после компиляции:
Integer number;
if (condition) {
number = getNumber();
} else {
number = 0;
}
против ..
Integer number = (condition) ? getNumber() : 0;
Оказывается, еслиcondition
являетсяtrue
,if
хорошо работает, а троичная операция во втором сегменте кодаNullPointerException
, Кажется, что троичная операция решила привести оба варианта кint
перед автоматической упаковкой результата обратно вInteger
!?! На самом деле, если я явно приведу0
вInteger
, исключение уходит. Другими словами:
Integer number = (condition) ? getNumber() : 0;
это не то же самое, что:
Integer number = (condition) ? getNumber() : (Integer) 0;
Таким образом, кажется, что есть разница в байт-коде между троичным оператором и эквивалентнымif-else
заявление (что я не сделалне ожидаю). Что поднимает три вопроса: почему есть разница? Это ошибка в троичной реализации или есть причина для приведения типа? Учитывая разницу, является ли троичная операция более или менее производительной, чем эквивалентнаяif
(я знаю, разница можетбыть огромным, но все же)?