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

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

int test = null;

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

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

Разве тернарная операция не является сокращением (в данном случае):

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

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


person Rafael T    schedule 08.11.2012    source источник
comment
Кстати, вы говорите о примитивных типах. Необработанные типы — это нечто совершенно другое. docs.oracle.com/javase/tutorial/java/generics/rawTypes. html   -  person Natix    schedule 08.11.2012
comment
ты прав! Я просто перепутал их, и соответственно изменил   -  person Rafael T    schedule 09.11.2012
comment
возможный дубликат сложного тернарного оператора в Java - автоупаковка   -  person Andy Brown    schedule 19.01.2015


Ответы (1)


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

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

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

Действительно, автораспаковка null приводит к ошибке NullPointerException.

Так почему же java-компилятор не выдает такой бред?

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

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

person Jesper    schedule 08.11.2012
comment
@nhahtdh Почему ты так думаешь? - person Jesper; 08.11.2012
comment
Извините, неважно. Ты прав. Это путаница с моей стороны при чтении дизассемблированного кода. - person nhahtdh; 08.11.2012