Вы догадались правильно. Для формального объяснения, ответ лежит в JLS:
Если один из второго и третьих операндов примитивного типа T и типа другого результата применения преобразования бокса (§5.1 +0,7) Т, то тип условного выражения Т.
так как вы есть примитивные 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());
какое значение есть в booleanString –
Да. Он пытается конвертировать 'null' в Boolean, я думаю. Не могли бы вы отправить подпись метода? –