2010-11-30 2 views
28

В Java, вы, как правило, говорят, чтоBoolean! = Ложь

if(someBool != false)

такая же, как

if(someBool)

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

+9

Почему бы вам не попробовать себя? – Jesper 2010-11-30 12:31:31

+0

@ Jesper: Я сделал, посмотрю мой собственный ответ ниже – 2010-11-30 13:40:26

ответ

42

Он будет бросать NullPointerException (autounboxing из null бросков NPE).

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

+0

+1 для ответа на вопрос. – cHao 2010-11-30 12:10:08

20

Использование ApacheCommons BooleanUtils.isTrue() или .isFalse()

+0

Это отличный способ пойти. Библиотеки ApacheCommons делают Java-программирование радостью. – 2015-06-10 23:05:26

-1

As Boolean даст вам объект, вы всегда должны проверить NULL перед началом работы на объекте

98

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

if(Boolean.TRUE.equals(someBool)) 
+0

Или если вы хотите что-то сделать, когда someBool также является «нулевым», `! Boolean.FALSE.equals (someBool)` – 2010-11-30 12:15:46

+0

@Bart `Boolean.FALSE.equals (null)` будет возвращать `false` - ваш оператор делает точно так же, как ответ Майкла. – Jesper 2010-11-30 12:34:15

+7

@Jesper: Нет. `! Boolean.FALSE.equals (null)` возвращает `true`, тогда как` Boolean.TRUE.equals (null) `возвращает` false`. Тем не менее, это хорошо показывает, что двойные отрицания трудно разобрать мысленно, и поэтому их лучше избегать. – 2010-11-30 12:42:23

3

Если someBool является Boolean

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

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

3

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

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"); 
0

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

2

Вы можете, однако, сравнить нулевой Boolean с булевым экземпляром.Например:

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

печатает:

false 
false 
0

Это старый, но Boolean.valueOf(null) это false, так же, как Boolean.valueOf(false) является false.

0

На самом деле булевский конструктор принимает значение null, возвращает FALSE и не бросает NullPointerTantrum.

new Boolean(null); 
<false> 

Это дополнительный бонус также дает thruthy ответ на строку "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> 

Обеспечение того, чтобы все ИСТИННЫЕ параметры, доступные в java, все еще остаются.

new Boolean(""+true); 
<true> 

new Boolean(""+"true"); 
<true> 
Смежные вопросы