java - generic - Booleano!=Falso
generic java (12)
Buenas ilustraciones de la diferencia entre el booleano primitivo y el objeto booleano . Lo primero solo puede ser verdadero o falso . Este último puede ser verdadero , falso o desconocido / indefinido . (es decir, nulo). El uso que haga dependerá de si desea tratar dos casos de uso o tres.
En Java, normalmente dirías que
if(someBool != false)
es lo mismo que
if(someBool)
Pero, ¿qué someBool
si someBool
no es de tipo boolean
sino Boolean
y su valor es null
?
Como Boolean le dará un objeto, siempre debe verificar si está NULL antes de trabajar en el objeto.
En realidad, el constructor booleano acepta nulo, devuelve FALSO y no lanza un NullPointerTantrum.
new Boolean(null);
<false>
Esto tiene la ventaja adicional de que también da una respuesta inteligente a la cadena "true"
que no es el caso de Boolean.TRUE.equals
pero estamos más restringidos nuevamente al tener solo constructores para Strings y Booleans.
Algo que se 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>
Asegurarse de que todas las opciones VERDADERAS, disponibles en java, permanezcan.
new Boolean(""+true);
<true>
new Boolean(""+"true");
<true>
Es antiguo, pero Boolean.valueOf(null)
es false
, al igual que Boolean.valueOf(false)
es false
.
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)
Se espera el primer NPE, porque o se autonboxing (y eso falla porque es nulo). El segundo sucede 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");
Si someBool
es Boolean
if (someBull != null && someBull) {
//Yeah, true.
}
Dado que Boolean puede ser null
asegúrese de evitar NullPointerException
comprobando que no sea nulo.
Si desea manejar instancias Boolean
así como primitivas y ser seguro de nulos, puede usar esto:
if(Boolean.TRUE.equals(someBool))
Si es Java 7+ puedes usar
import java.util.Objects;
Y
if (Objects.equals(someBool, true))
Si es nulo, obtendrás una NullPointerException
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
Utilice ApacheCommons BooleanUtils.isTrue () o .isFalse ()
autounboxing una NullPointerException
( autounboxing of null
throws NPE).
Pero eso solo significa que no debe permitir un valor null
. Utilice un valor predeterminado, o no use el autounboxing y realice una comprobación no nula. Porque usar un valor null
de un valor booleano significa que tienes 3, no 2 valores. (Michael y Tobiask propusieron mejores formas de manejarlo)