В Java вы обычно говорите, что
if(someBool != false)
совпадает с
if(someBool)
Но что, если someBool
не относится к типу boolean
, а boolean
, а его значение null
?
В Java вы обычно говорите, что
if(someBool != false)
совпадает с
if(someBool)
Но что, если someBool
не относится к типу boolean
, а boolean
, а его значение null
?
Он выкинет NullPointerException
(autounbing null
выдает NPE).
Но это означает, что вы не должны допускать значение null
. Либо используйте значение по умолчанию, либо не используйте autounboxing и выполняйте непустую проверку. Потому что использование значения null
для булева означает, что у вас есть 3, а не 2 значения. (Более эффективные способы обращения с ним были предложены Майклом и Тобиасом)
Если вы хотите обрабатывать экземпляры Boolean
, а также примитивы и быть нулевыми, вы можете использовать это:
if(Boolean.TRUE.equals(someBool))
Используйте ApacheCommons BooleanUtils.isTrue() или .isFalse()
Если someBool
есть Boolean
if (someBull != null && someBull) {
//Yeah, true.
}
Так как Boolean может быть null
, убедитесь, что вы избегаете NullPointerException
, проверяя значение null.
Я сделал небольшой тест:
Boolean o = null;
try {
System.out.println(o ? "yes" : "no");
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println((o != false) ? "yes" : "no");
} catch (Exception e) {
e.printStackTrace();
}
Выход удивляет:
java.lang.NullPointerException
at btest.main(btest.java:10)
java.lang.NullPointerException
at btest.main(btest.java:15)
Ожидается, что первый NPE будет ожидаться, потому что o будет autounboxed (и это терпит неудачу, потому что оно null). Второе происходит по той же причине, но это не кажется естественным. Во всяком случае, решение должно сделать:
System.out.println(!Boolean.FALSE.equals(o) ? "yes" : "no");
Однако вы можете сравнить нулевой Boolean с булевым экземпляром. Например:
Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);
Отпечатки:
false
false
Хорошие иллюстрации разницы между примитивным булевым и объектом Boolean. Первый может быть только true или false. Последнее может быть true, false или unknown/undefined. (т.е. null). Что вы используете, зависит от того, хотите ли вы иметь дело с двумя вариантами использования или тремя.
Он старый, но Boolean.valueOf(null)
равен false
, так же как Boolean.valueOf(false)
есть false
.
Фактически логический конструктор принимает значение null, возвращает FALSE и не бросает NullPointerTantrum.
new Boolean(null);
<false>
У этого есть дополнительный бонус, также дающий ответную реакцию на строку "true"
, которая не относится к Boolean.TRUE.equals
, но мы более ограничены снова, имея только конструкторы для Строков и Булевых.
То, что вы можете преодолеть с помощью конкатенации строк, которая также является нулевой.
new Boolean(""+null);
<false>
new Boolean(""+false);
<false>
new Boolean(""+new Object());
<false>
new Boolean(""+6);
<false>
new Boolean(""+new Integer(9));
<false>
Обеспечение того, что все TRUE-опции, доступные в java, все еще остаются.
new Boolean(""+true);
<true>
new Boolean(""+"true");
<true>
Поскольку Boolean даст вам объект, вы должны всегда проверять NULL перед тем, как работать с объектом
Если его значение null, вы получите исключение NullPointerException