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

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

Boolean bool = null;

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

Почему моя проверка на логической переменной "bool" приводит к исключению? Разве он не должен просто прыгать прямо за утверждение if, когда он "видит", что это не так? Когда я удаляю оператор if или проверяю, если оно НЕ равно null, исключение исчезает.

Ответ 1

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

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

if(bool != null && bool) { ... }

Ответ 2

Если вам не нравятся лишние проверки:

if (Boolean.TRUE.equals(value)) {...}

Ответ 3

Используйте Apache BooleanUtils.

Не изобретайте велосипед.

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

В противном случае используйте то, что уже было построено, и используйте isTrue():

BooleanUtils.isTrue( bool );

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

Если вы не ограничены библиотеками, которые вам "разрешены", есть множество полезных вспомогательных функций для всех видов прецедентов, включая Booleans и Strings. Я предлагаю вам ознакомиться с различными библиотеками Apache и посмотреть, что они уже предлагают.

Ответ 4

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

if (bool != null && bool)
{
  //DoSomething
}                   

Ответ 5

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

Классы-оболочки в API Java служат в двух основных целях:

  • Предоставить механизм для "обертки" примитивных значений в объекте, чтобы что примитивы могут быть включены в действия, зарезервированные для объекты, например, как добавленные в Коллекции, или возвращенные из метод с возвращаемым значением объекта.
  • Предоставить ассортимент функции полезности для примитивов. Большинство из этих функций связанные с различными преобразованиями: преобразование примитивов в и из Строковые объекты и преобразования примитивов и объектов String в с разных оснований (или радиуса), таких как двоичные, восьмеричные и шестнадцатеричное.

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

Ответ 6

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