В Java, вы, как правило, говорят, чтоBoolean! = Ложь
if(someBool != false)
такая же, как
if(someBool)
Но что, если someBool
не типа boolean
но Boolean
, и его значение равно null
?
В Java, вы, как правило, говорят, чтоBoolean! = Ложь
if(someBool != false)
такая же, как
if(someBool)
Но что, если someBool
не типа boolean
но Boolean
, и его значение равно null
?
Он будет бросать NullPointerException
(autounboxing из null
бросков NPE).
Но это означает, что вы не должны допускать значения null
. Либо используйте значение по умолчанию, либо не используйте autounboxing и выполняйте непустую проверку. Поскольку значение null
булева означает, что у вас есть 3, а не 2 значения. (Лучшие способы обращения с ним были предложены Майклом и Tobiask)
+1 для ответа на вопрос. – cHao 2010-11-30 12:10:08
Использование ApacheCommons BooleanUtils.isTrue() или .isFalse()
Это отличный способ пойти. Библиотеки ApacheCommons делают Java-программирование радостью. – 2015-06-10 23:05:26
As Boolean даст вам объект, вы всегда должны проверить NULL перед началом работы на объекте
Если вы хотите обрабатывать Boolean
экземпляров, а также примитивы и быть нулевым в безопасности, вы можете использовать это:
if(Boolean.TRUE.equals(someBool))
Или если вы хотите что-то сделать, когда someBool также является «нулевым», `! Boolean.FALSE.equals (someBool)` – 2010-11-30 12:15:46
@Bart `Boolean.FALSE.equals (null)` будет возвращать `false` - ваш оператор делает точно так же, как ответ Майкла. – Jesper 2010-11-30 12:34:15
@Jesper: Нет. `! Boolean.FALSE.equals (null)` возвращает `true`, тогда как` Boolean.TRUE.equals (null) `возвращает` false`. Тем не менее, это хорошо показывает, что двойные отрицания трудно разобрать мысленно, и поэтому их лучше избегать. – 2010-11-30 12:42:23
Если someBool
является Boolean
if (someBull != null && someBull) {
//Yeah, true.
}
Поскольку Boolean может быть null
, убедитесь, что вы избегаете NullPointerException
, проверяя, что он не равен нулю.
Если его нулевым, тогда вы получите NullPointerException
Я сделал небольшой тест:
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 . Первым может быть только true или false. Последнее может быть true, false, или неизвестно/не определено. (т. е. null). Которое вы используете, зависит от того, хотите ли вы иметь дело с двумя вариантами использования или тремя.
Вы можете, однако, сравнить нулевой Boolean с булевым экземпляром.Например:
Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);
печатает:
false
false
Это старый, но Boolean.valueOf(null)
это false
, так же, как Boolean.valueOf(false)
является false
.
На самом деле булевский конструктор принимает значение 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>
Почему бы вам не попробовать себя? – Jesper 2010-11-30 12:31:31
@ Jesper: Я сделал, посмотрю мой собственный ответ ниже – 2010-11-30 13:40:26