Вы правильно угадали. Для формального объяснения ответ лежит в JLS:
Если один из второго и третьего операндов имеет примитивный тип T, а тип другого является результатом применения преобразования упаковки (§5.1.7) к T, то тип условного выражения — T.
Так как у вас есть примитивы true
и false
в обоих выражениях, тип вашего выражения условия будет boolean
.
Когда вы попадаете во второе выражение, во втором случае нулевая ссылка преобразуется в логическое значение с null.booleanValue();
, вызывая NPE, так что выражение эквивалентно:
return Boolean.valueOf(null.booleanValue());
(тогда возвращаемый тип выражения переупаковывается в Boolean
, но уже слишком поздно, как вы догадались).
Например:
return ("true".equals(booleanString) ? Boolean.TRUE : ("false".equals(booleanString) ? Boolean.FALSE : null));
не вызывает NPE, так как тип выражения Boolean
. Это, однако,
return ("true".equals(booleanString) ? true : ("false".equals(booleanString) ? Boolean.FALSE : null));
вызывает его, потому что снова применяется то же правило (поскольку первое выражение является примитивным типом boolean
). Так что это эквивалентно:
return Boolean.valueOf(("true".equals(booleanString) ? true : ("false".equals(booleanString) ? Boolean.FALSE : null).booleanValue());
person
Alexis C.
schedule
06.05.2015
null
в логическое значение. Не могли бы вы опубликовать подпись метода? - person Venkata Raju   schedule 06.05.2015