NullPointerException выдает, когда я использую тернарный оператор

У меня есть следующий оператор возврата:

public Boolean foo(String booleanString){  
    return ("true".equals(booleanString) ? true : ("false".equals(booleanString) ? false : null));
}

когда booleanString равно не true и не false, я получаю NullPointerException.

Проблема с боксом/распаковкой?


person gstackoverflow    schedule 06.05.2015    source источник
comment
какое значение есть в booleanString   -  person Gnanadurai A    schedule 06.05.2015
comment
да. Я думаю, он пытается преобразовать null в логическое значение. Не могли бы вы опубликовать подпись метода?   -  person Venkata Raju    schedule 06.05.2015


Ответы (2)


Вы правильно угадали. Для формального объяснения ответ лежит в 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

Поскольку вы возвращаете тип объекта Boolean, java пытается распаковать возвращаемое значение null в примитивный тип boolean в логическом выражении, где использовалось foo(). И вы получаете исключение нулевого указателя.

Вот аналогичный случай и мое объяснение: https://stackoverflow.com/a/30055584/784540

person Community    schedule 06.05.2015