Pregunta
En Java, se podría decir que por lo general
if(someBool != false)
es el mismo que
if(someBool)
Pero lo que si someBool
no es del tipo boolean
pero Boolean
, y su valor es null
?
Solución
Se lanzará un NullPointerException
( autounboxing null
de tiros NPE).
Pero eso sólo significa que no se debe permitir que un valor null
. O bien utilizar un defecto, o no utilice autounboxing y realizar una prueba de que no sea nulo. Debido a que el uso de un valor de un medio null
booleanas que tiene 3, no 2 valores. (Mejores maneras de manejar que se propuso por Michael y Tobiask)
Otros consejos
Si desea manejar casos Boolean
así como primitivas y será nula de fallos, puede utilizar lo siguiente:
if(Boolean.TRUE.equals(someBool))
Uso Apache Commons BooleanUtils.isTrue () o .isFalse ()
Si se someBool
Boolean
if (someBull != null && someBull) {
//Yeah, true.
}
Desde booleana puede ser null
asegúrese de evitar NullPointerException
mediante la comprobación de que no nulo.
Me hice una pequeña prueba:
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();
}
La salida es sorprendente:
java.lang.NullPointerException
at btest.main(btest.java:10)
java.lang.NullPointerException
at btest.main(btest.java:15)
El primer NPE es de esperar, porque o se autounboxed (y que no porque es nulo). El segundo pasa por la misma razón, pero no se siente natural. De todos modos, la solución es hacer:
System.out.println(!Boolean.FALSE.equals(o) ? "yes" : "no");
Sin embargo se puede comparar un valor nulo de Boole con una instancia de Boole. Por ejemplo:
Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);
impresiones:
false
false
Los buenos ejemplos de la diferencia entre la primitiva boolean & el objeto booleano . El primero puede ser solamente true o false . Este último puede ser true , false o desconocido / indefinido . (Es decir, null). Que se utiliza depende de si se quiere tratar con dos casos de uso o tres.
Es viejo, pero es Boolean.valueOf(null)
false
, al igual que Boolean.valueOf(false)
es false
.
En realidad el constructor de Boole acepta nulo, devuelve falso y no lanza un NullPointerTantrum.
new Boolean(null);
<false>
Esto tiene la ventaja añadida de que también da una respuesta a la thruthy "true"
cadena que no es el caso para Boolean.TRUE.equals
pero estamos más restringido de nuevo tener sólo constructores para cuerdas y booleanos.
Algo que puede superar con la concatenación de cadenas, que también es nula a prueba.
new Boolean(""+null);
<false>
new Boolean(""+false);
<false>
new Boolean(""+new Object());
<false>
new Boolean(""+6);
<false>
new Boolean(""+new Integer(9));
<false>
Asegurar que todas las opciones disponibles en TRUE, Java, todavía permanece.
new Boolean(""+true);
<true>
new Boolean(""+"true");
<true>
Si se trata de Java 7+ puede utilizar
import java.util.Objects;
y
if (Objects.equals(someBool, true))
As Boolean le dará un objeto, siempre hay que comprobar NULL antes de trabajar en el objeto
Si su nula entonces obtendrá una NullPointerException