Проверьте, является ли значение 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, вам нужно сначала инициализировать переменную где-то с ненулевым значением, а затем изменить ее.