Почему следующая строка кода создает NullPointerException
?
Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
Я понимаю, что распаковка производится на null
, но почему?
Обратите внимание, что
Long v = (Long) null;
Не создает исключение.
Почему следующая строка кода создает NullPointerException
?
Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
Я понимаю, что распаковка производится на null
, но почему?
Обратите внимание, что
Long v = (Long) null;
Не создает исключение.
Таким образом, кажется очевидным, что вам нужно боксировать только в том случае, если условие истинно, и не должно быть бокса, если условие ложно. Однако выражение тернарного оператора должно иметь определенный тип static. Итак, у нас есть Long
и long
. JLS утверждает, что результатом будет примитив (точно так же — представьте, если бы оператор был, скажем, +
или даже ==
). Таким образом, тернарный оператор принудительно распаковывает, и только тогда присваивание вызывает упаковку.
Если бы вы заменили код на эквивалентный if-else
, то у вас было бы просто назначение от long
до Long
и от Long
до Long
, которое не распаковывалось и поэтому работало нормально.
IIRC, это покрыто Java Puzzlers от Bloch & Gafter.
Из JSL
- Если второй и третий операнды имеют одинаковый тип (который может быть нулевым типом), то это тип условного выражения.
- Если один из второго и третьего операндов имеет тип
boolean
, а тип другого — типBoolean
, то тип условного выражения —boolean
.
В следующем операторе тип второго операнда — long
, а третьего — Long
.
Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
Это будет работать, если выражение истинно.
Long v= 1 == 1 ? Long.MAX_VALUE : (Long) null;
Или вы можете бросить его.
Long v= 1 == 2 ? Long.valueOf(Long.MAX_VALUE) : (Long) null;
Long
; актерский состав не проблема. Вы можете привести null
к любому типу объекта, см. спецификацию языка Java раздел 5.5 в разделе Если приведение к ссылочному типу не является ошибкой времени компиляции, существует несколько случаев:
- person Paul; 15.12.2011
Long.MAX_VALUE
, поскольку оно возвращаетlong
. - person BalusC   schedule 15.12.2011