Этот кусок кода работает нормально: -
Integer nullInt = null;
if (1 <= 3) {
Integer secondNull = nullInt;
} else {
Integer secondNull = -1;
}
System.out.println("done");
Но это вызывает исключение нулевого указателя, а Eclipse предупреждает о необходимости автоматической распаковки: -
Integer nullInt = null;
Integer secondNull = 1 <= 3 ? nullInt : -1;
System.out.println("done");
Почему это так, кто-нибудь может помочь, пожалуйста?
java
if-statement
conditional-operator
91StarSky
источник
источник
Я почти уверен, что аргументы троичного оператора должны быть такого же типа. Так как вы используете -1 и некоторый константный
nullint
компилятор пытается распаковать,nullint
чтобы получить значение. А затем автобокс его хранить вsecondNull
переменной.источник
Это происходит потому, что, когда два операнда для условного оператора
? :
являются примитивным типом и его ссылочным типом в штучной упаковке, выполняется преобразование без распаковки ( JLS §15.25.2 ):В общем случае замена
if
оператора? :
выражением не всегда сохраняет смысл кода, поскольку само? :
выражение должно иметь тип времени компиляции. Это означает, что когда типы двух операндов различны, необходимо выполнить преобразование в один или оба, чтобы у результата был согласованный тип времени компиляции.источник
Этот работал (в Java 1.8):
источник