Boolean! = False - PullRequest
       18

Boolean! = False

33 голосов
/ 30 ноября 2010

В Java вы обычно говорите, что

if(someBool != false)

совпадает с

if(someBool)

Но что, если someBool имеет тип boolean, а не Boolean, а его значение равно null?

Ответы [ 12 ]

112 голосов
/ 30 ноября 2010

Если вы хотите обрабатывать Boolean экземпляров, а также примитивы и быть нулевыми, вы можете использовать это:

if(Boolean.TRUE.equals(someBool))
48 голосов
/ 30 ноября 2010

Будет выброшено NullPointerException ( автозагрузка из null бросков NPE).

Но это только означает, что вы не должны разрешать значение null. Либо используйте значение по умолчанию, либо не используйте autounboxing и сделайте ненулевую проверку. Потому что использование логического значения null означает, что у вас есть 3, а не 2 значения. (Лучшие способы обращения с ним были предложены Майклом и Тобиаском)

21 голосов
/ 30 ноября 2010

Используйте ApacheCommons BooleanUtils.isTrue () или .isFalse ()

3 голосов
/ 30 ноября 2010

Я сделал небольшой тест:

    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 будет автоматически помещен в коробку (и это терпит неудачу, потому что это нуль) Второе происходит по той же причине, но это не кажется естественным. В любом случае, решение заключается в следующем:

System.out.println(!Boolean.FALSE.equals(o) ? "yes" : "no");
3 голосов
/ 30 ноября 2010

Если someBool равно Boolean

if (someBull != null && someBull) {
  //Yeah, true.
}

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

2 голосов
/ 27 мая 2013

Однако вы можете сравнить нулевое логическое значение с логическим экземпляром.Например:

Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);

отпечатки:

false
false
0 голосов
/ 28 апреля 2018

Если это Java 7+, вы можете использовать

import java.util.Objects;

И

if (Objects.equals(someBool, true))
0 голосов
/ 02 сентября 2017

На самом деле логический конструктор принимает значение 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, все еще остаются.

0 голосов
/ 08 августа 2017

Старо, но Boolean.valueOf(null) равно false, как Boolean.valueOf(false) равно false.

0 голосов
/ 01 декабря 2010

Хорошие иллюстрации различий между примитивом логическим и объектом логическим . Первый может быть только true или false . Последний может быть true , false или неизвестно / не определено . (то есть, ноль). То, что вы используете, зависит от того, хотите ли вы иметь дело с двумя или тремя вариантами использования.

...