Подтвердить что ты не робот

Почему я могу установить примитивные типы в null в тройных операциях

Я всегда думал, что примитивные типы в Java не могут быть null, так как это ошибка времени компиляции, если я пытаюсь сделать что-то вроде этого:

int test = null;

Однако в тройной операции, похоже, разрешено:

int test = something != 0 ? 5 : null;

Не является тройной операцией, которая просто короткая (в данном случае):

int test;
if (something != 0){
    test = 5;
} else {
    test = null
}

который, разумеется, нельзя допускать. если это условие терпит неудачу, он автоматически выбросит NullPointerException из-за автобоксинга. Итак, почему java-компилятор не производит такую ​​чушь?

4b9b3361

Ответ 1

Что происходит, так это то, что компилятор Java сначала пытается сделать типы выражений по обе стороны от : равными. В этом случае он отключает 5 до Integer; обратите внимание, что null является допустимым значением для Integer. Результат всего тройного выражения равен Integer. Вы назначаете это int, поэтому Integer затем автоматически запускается.

По сути, компилятор применяет autoboxing и -unboxing, чтобы строка выглядела так:

int test = (something != 0 ? Integer.valueOf(5) : null).intValue();

В самом деле, autounboxing null приводит к NullPointerException.

Итак, почему java-компилятор не воспринимает такие глупости?

Поскольку разработчики языка Java определили язык таким образом, что он работает так и не решил, что это должно рассматриваться как ошибка...

Раздел 15.25 Спецификации языка Java объясняет, как определяется тип всего выражения.