En Java, por lo general, diría quebooleana! = False
if(someBool != false)
es lo mismo que
if(someBool)
Pero lo que si someBool
no es de tipo boolean
pero Boolean
, y su valor es null
?
En Java, por lo general, diría quebooleana! = False
if(someBool != false)
es lo mismo que
if(someBool)
Pero lo que si someBool
no es de tipo boolean
pero Boolean
, y su valor es null
?
Será lanzar una NullPointerException
(autounboxing de null
tiros NPE).
Pero eso solo significa que no debe permitir un valor de null
. Utilice un valor predeterminado, o no use la función de autoenlace y realice una comprobación que no sea nula. Debido a que usar un valor null
de booleano significa que tiene 3, no 2 valores. (Mejores formas de manejo que fueron propuestos por Michael y Tobiask)
+1 por responder la pregunta. – cHao
Uso Apache Commons BooleanUtils.isTrue() o .isFalse()
Esta es una gran manera de hacerlo. Las bibliotecas ApacheCommons hacen que la programación Java sea una delicia. –
As Boolean le dará un objeto, siempre hay que comprobar NULL antes de trabajar en el objeto
Si desea manejar Boolean
casos, así como primitivas y será nula de fallos, puede utilizar esto:
if(Boolean.TRUE.equals(someBool))
O si desea hacer algo cuando someBool es 'nulo' también,'! Boolean.FALSE.equals (someBool) ' –
@Bart' Boolean.FALSE.equals (null) 'devolverá' false' - su instrucción no exactamente lo mismo que la respuesta de Michael. – Jesper
@Jesper: No. '! Boolean.FALSE.equals (null)' devuelve 'true' mientras' Boolean.TRUE.equals (null) 'devuelve' false'. Sin embargo, esto demuestra muy bien que las dobles negaciones son difíciles de analizar mentalmente y, por lo tanto, es mejor evitarlas. –
Si someBool
es Boolean
if (someBull != null && someBull) {
//Yeah, true.
}
Dado que Boolean puede ser null
, asegúrese de evitar NullPointerException
comprobando si no es nulo.
Si su nula entonces obtendrá una NullPointerException
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)
La primera NPE es de esperar , porque o se autoencapsulará (y eso falla porque es nulo). El segundo ocurre 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");
Puede evitar la doble negación diciendo 'Boolean.TRUE.equals (O)' –
@ChrisParton no, no se puede actualy. Véanse los comentarios sobre la respuesta de Michael Borgwardt para la diferencia en caso nula – Zavael
buenos ejemplos de la diferencia entre la primitiva booleano & del objeto Boolean. El primero solo puede ser verdadero o falso. El último puede ser verdadero, falso, o desconocido/indefinido. (es decir, nulo). El que use depende de si desea tratar con dos casos de uso o tres.
Por desgracia, hay otras razones que uno querría usar booleana, por ejemplo, el almacenamiento de los valores de una colección de objetos. En ese caso, debe tratar los tres casos de uso, los quiera o no. –
Sin embargo, puede comparar un booleano nulo con una instancia booleana.Por ejemplo:
Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);
impresiones:
false
false
Esto no funcionará si creo un booleano con nuevo, solo funcionará cuando [valueOf] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147 /java/lang/Integer.java#Integer.valueOf%28int%29) y, posiblemente, se utiliza autoboxing 'assertThat (new Boolean (true) == Boolean.TRUE, es (true));' esta prueba no pasa. .. – stivlo
@stivlo: Hubiera querido que los booleanos (y todos los objetos que representan primitivos) hubieran estado en alguna forma de grupo y se consideraran iguales. Gracias por el comentario, hoy aprendí algo. – njzk2
usa 'Boolean.TRUE.equals (myBool)' o 'Boolean.FALSE.equals (myBool)' en su lugar. – Dallas
Es viejo, pero es Boolean.valueOf(null)
false
, al igual que Boolean.valueOf(false)
es false
.
En realidad, el constructor booleano acepta nulo, devuelve FALSE y no arroja un NullPointerTantrum.
new Boolean(null);
<false>
Esto tiene la ventaja añadida de que también da una respuesta thruthy a la cadena "true"
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 a prueba de nulos.
new Boolean(""+null);
<false>
new Boolean(""+false);
<false>
new Boolean(""+new Object());
<false>
new Boolean(""+6);
<false>
new Boolean(""+new Integer(9));
<false>
Asegurando que todas las opciones TRUE, disponibles en java, aún permanecen.
new Boolean(""+true);
<true>
new Boolean(""+"true");
<true>
¿Por qué no lo pruebas tú mismo? – Jesper
@Jesper: lo hice, veo mi propia respuesta debajo de –