Проверьте, имеет ли значение null Boolean значение true, приводит к исключению

У меня есть следующий код:

Boolean bool = null;

try 
{
    if (bool)
    {
        //DoSomething
    }                   
} 
catch (Exception e) 
{
    System.out.println(e.getMessage());             
}

Почему я проверяю логическую переменную & quot; bool & quot; привести к исключению? Не должен он просто перепрыгнуть сразу после оператора if, когда он "видит" что это не так? When I remove the if statement or check up on if it's NOT null, the exception goes away.

 Marvo13 июн. 2012 г., 00:34
Ответы выше о распаковке объектов верны. Для полноты картины, однако, вы также можете изменить свой код, чтобы использовать примитив & quot; логическое значение & quot; вместо обёртки объекта "Boolean". Вам также следует освежить в себе разницу между примитивом и объектом.
 simon.watts16 апр. 2018 г., 14:03
В то же время ...if (bool == Boolean.TRUE) оценивает ложь без генерации исключения. Не уверен, было ли это преднамеренным в случае, который я только что нашел.
 StaxMan21 февр. 2019 г., 02:07
@ simon.watts, который будет ложным дляbool являющийсяnull Или еслиBoolean был построен явно (а не как ссылка наBoolean.TRUE). Так что не рекомендуется; в отличие отif (Boolean.TRUE.equals(bool)) который будет работать, как ожидалось, включая безопасную обработкуnull значение.

Ответы на вопрос(6)

Use the Apache BooleanUtils.

(If peak performance is the most important priority in your project then look at one of the other answers for a native solution that doesn't require including an external library.)

Не изобретайте велосипед. Используйте то, что уже построено и используетсяisTrue():

BooleanUtils.isTrue( bool );

Проверяет, еслиBoolean значение верно, обработкаnull вернувшисьfalse.

If you're not limited to the libraries you're "allowed" to include, there are a bunch of great helper functions for all sorts of use-cases, including Booleans and Strings. I suggest you peruse the various Apache libraries and see what they already offer.

 24 июл. 2015 г., 17:25
That Библиотека заново изобретает колесо. Я стараюсь избегать таких библиотек, насколько это возможно.
 26 дек. 2014 г., 18:42
@PaulManta Я согласен, если это единственное, что вы 'dever использовать в библиотеках Apache Utils, но предлагаемая идея состоит в том, чтобы "прочесть" библиотеки, чтобы подвергнуть себя другим полезным функциям.
 26 июл. 2015 г., 17:25
@mschonaker Если Apache BooleanUtils заново изобретает колесо, что это заoriginal рулевое колесо? Идея состоит в том, чтобы избежать создания набора вспомогательных функций, которые имитируют то, что уже было сделано в таких библиотеках, как эта. Я также используюtoStringYesNo из этой библиотеки во всех моих приложениях.
 12 мар. 2015 г., 13:53
За использование этих библиотек снижается производительность. Поэтому для таких базовых вещей, которые являются частью языка, вы не должны использовать библиотеки.
 25 дек. 2014 г., 18:13
Изобретать колесо не кажется таким уж плохим, когда альтернатива использует внешнюю библиотеку для чего-то столь же простого, как это.

if (Boolean.TRUE.equals(value)) {...}
 08 дек. 2015 г., 00:21
@fortran +1 для "twingleton".
 25 янв. 2016 г., 21:27
Я нашел этот ответ полезным во многих случаях, когда я чувствовал разочарование в связи с тем, что мой код выполняет подробные проверки на ноль. Хотел бы я +1 каждый раз.
 04 июн. 2015 г., 21:23
да, это позор, конструктор должен быть закрытым, чтобы он гарантировал, что это twingleton ...
 17 сент. 2014 г., 15:17
@AvrDragon: равно ли требуется? Оператор == работает здесь, так как логическое имеет только два значения
 02 дек. 2014 г., 15:45
@ Атул Да, здесь нужно равное. Потому что (new Boolean (true) == new Boolean (true)) равно .... false. Причина: Boolean - это просто класс, который может иметь несколько экземпляров, как и любой другой класс в Java.

вы всегда получите исключение NullPointerException, вам нужно сначала инициализировать переменную где-нибудь с ненулевым значением, а затем изменить его.

 01 авг. 2016 г., 08:19
"you will always" - Не всегда, за исключением примера, упрощенный код, который ничего не делает между инициализацией переменной вnull и затем тестирую это. Предположительно реальный код не был бы таким простым или весьif тест может быть удален.
 12 июн. 2012 г., 23:54
Если бы это былоcatch блок будет обрабатывать исключение NullPointerException. Проблема здесь в том, что OP пытается распаковать нулевую ссылку в примитив.

ния. Этот класс, как и любой класс, действительно может быть нулевым. Из соображений производительности и памяти всегда лучше использовать примитив.

The wrapper classes in the Java API serve two primary purposes:

To provide a mechanism to “wrap” primitive values in an object so that the primitives can be included in activities reserved for objects, like as being added to Collections, or returned from a method with an object return value. To provide an assortment of utility functions for primitives. Most of these functions are related to various conversions: converting primitives to and from String objects, and converting primitives and String objects to and from different bases (or radix), such as binary, octal, and hexadecimal.

http://en.wikipedia.org/wiki/Primitive_wrapper_class

Решение Вопроса

boolean это может быть либоtrue или жеfalse, Тем не менее, когда у вас естьBoolean это может быть либоBoolean.TRUE, Boolean.FALSE или жеnull как и любой другой объект.

В вашем конкретном случае вашBoolean являетсяnull иif оператор запускает неявное преобразование вboolean который производитNullPointerException, Вам может понадобиться вместо этого:

if(bool != null && bool) { ... }
 13 дек. 2018 г., 14:50
Я изо всех сил пытаюсь понять, почемуif (myBoolean) (гдеmyBoolean являетсяBoolean) не вызывает ошибку компилятора или хотя бы предупреждение. Это гоча точно.
 13 июн. 2012 г., 03:22
ТехническиBoolean может быть любое количество истинных экземпляров, а не толькоBoolean.TRUE, Напримерnew Boolean(true).

Boolean типы могут бытьnull, Вам нужно сделатьnull проверьте, как вы установили егоnull.

                   
 13 июн. 2012 г., 02:24
Что тогда ПРАВИЛЬНО? Я не вижу вашего ответа здесь.
 12 июн. 2012 г., 23:46
Что не так с этим ответом? Это не проверка bool, которая выдает исключение. Ненужные отрицательные голоса.
 13 июн. 2012 г., 04:42
Правильный путь - тот, что выше ... нет обработки исключений. Кроме того, обработка исключений является слишком общей и не рекомендуется.
 13 июн. 2012 г., 00:44
Передача исключений не нужна, и, кроме того, это делается таким образом, что это плохой пример для начинающих. Это заслуживает отрицательного ответа, ИМО. (Да ... Я знаю, что это происходит из примера кода, но повторение его в Ответе, кажется, подтверждает это.)
 13 июн. 2012 г., 00:35
Я согласен, что это вполне разумный ответ. Вы можете избавиться от обработки исключений, хотя.

Ваш ответ на вопрос