У меня есть следующий код:
Boolean bool = null;
try
{
if (bool)
{
//DoSomething
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
Почему моя проверка на булеву переменную "bool" приводит к исключению? Разве он не должен просто перепрыгнуть через оператор if, когда «видит», что это неправда? Когда я удаляю оператор if или проверяю, не является ли он нулевым, исключение исчезает.
if (bool == Boolean.TRUE)
оценивает false без генерации исключения. Не уверен, было ли это намеренно в случае, который я только что нашел.bool
того, чтобы бытьnull
ИЛИ, еслиBoolean
был построен явно (а не как ссылкаBoolean.TRUE
). Так что не рекомендуется; в отличие от того,if (Boolean.TRUE.equals(bool))
который будет работать, как ожидалось, в том числе безопасно обрабатыватьnull
стоимость.Ответы:
Когда у вас есть,
boolean
это может бытьtrue
илиfalse
. Тем не менее, когда у вас есть,Boolean
это может быть либоBoolean.TRUE
,Boolean.FALSE
либоnull
как любой другой объект.В вашем конкретном случае, оператор
Boolean
isnull
и isif
запускает неявное преобразование вboolean
то, что производитNullPointerException
. Вам может понадобиться вместо этого:источник
Boolean
может быть любое количество истинных примеров, а не простоBoolean.TRUE
. Напримерnew Boolean(true)
.if (myBoolean)
(гдеmyBoolean
этоBoolean
) не вызывает ошибку компилятора или, по крайней мере, предупреждение. Это гоча точно.Если вам не нравятся дополнительные нулевые проверки:
источник
Используйте Apache BooleanUtils .
(Если пиковая производительность является наиболее важным приоритетом в вашем проекте, посмотрите на один из других ответов для нативного решения, которое не требует включения внешней библиотеки.)
Не изобретай велосипед. Используйте то, что уже было построено и используйте
isTrue()
:Проверяет, является ли
Boolean
значение истинным, обрабатываетnull
путем возвратаfalse
.Если вы не ограничены библиотеками, которые вам «разрешено» включать, есть множество отличных вспомогательных функций для всех видов сценариев использования, включая
Booleans
иStrings
. Я предлагаю вам просмотреть различные библиотеки Apache и посмотреть, что они уже предлагают.источник
toStringYesNo
из этой библиотеки во всех моих приложениях.Boolean
типы могут бытьnull
. Вы должны сделатьnull
проверку, как вы установили егоnull
.источник
Или с силой Java 8 Необязательно, вы также можете сделать такой трюк:
:)
источник
Boolean - это класс обёртки объекта для примитивного логического значения. Этот класс, как и любой класс, действительно может быть нулевым. Из соображений производительности и памяти всегда лучше использовать примитив.
Классы-обертки в Java API служат двум основным целям:
http://en.wikipedia.org/wiki/Primitive_wrapper_class
источник
так как ваша переменная bool указывает на нуль, вы всегда получите исключение NullPointerException, вам нужно сначала инициализировать переменную где-нибудь с ненулевым значением, а затем изменить его.
источник
catch
блок обработал бы исключение NullPointerException. Проблема здесь в том, что OP пытается распаковать нулевую ссылку в примитив.null
и ее тестированием. Предположительно реальный код не был бы таким простым, или весьif
тест можно было бы удалить.