2015-05-06 3 views
7

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

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

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

Действительно ли это бокс/распаковка проблемы?

+0

какое значение есть в booleanString –

+1

Да. Он пытается конвертировать 'null' в Boolean, я думаю. Не могли бы вы отправить подпись метода? –

ответ

7

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

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

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

Смежные вопросы