Comprobar si el booleano nulo es verdadero da como resultado una excepción

Tengo el siguiente código:

Boolean bool = null;

try 
{
    if (bool)
    {
        //DoSomething
    }                   
} 
catch (Exception e) 
{
    System.out.println(e.getMessage());             
}

¿Por qué mi comprobación de la variable booleana "bool" da como resultado una excepción? ¿No debería simplemente saltar más allá de la declaración if cuando "vea" que no es cierto? Cuando elimino la declaración if o compruebo si NO es nulo, la excepción desaparece.

preguntado el 12 de junio de 12 a las 22:06

Las respuestas anteriores sobre el desempaquetado de objetos son todas correctas. Sin embargo, en aras de la integridad, también puede cambiar su código para usar el primitivo "booleano" en lugar del envoltorio de objeto "Booleano". También deberías refrescarte sobre la diferencia entre un primitivo y un Objeto. -

Mientras tanto... if (bool == Boolean.TRUE) evalúa falso sin generar una excepción. No estoy seguro si esto fue intencional en el caso que acabo de encontrar. -

@simon.watts eso sería falso para bool "Ser" null O si Boolean fue construida explícitamente (y no como referencia a Boolean.TRUE). Así que no recomendado; Opuesto a if (Boolean.TRUE.equals(bool)) que funcionaría como se esperaba, incluida la manipulación segura null valor. -

9 Respuestas

Si no le gustan los cheques nulos adicionales:

if (Boolean.TRUE.equals(value)) {...}

Respondido el 24 de enero de 15 a las 21:01

@AvrDragon: ¿Se requieren iguales? El operador == funciona aquí ya que Boolean solo tiene dos valores: Atul

@Atul Sí, aquí se requieren iguales. Porque (nuevo booleano (verdadero) == nuevo booleano (verdadero)) es... falso. Razón: Boolean es solo una clase y puede tener múltiples instancias como cualquier otra clase en Java. - AvrDragon

sí, es una pena, el constructor debería ser privado para garantizar que sea un twingleton... - Fortran

Esto es exactamente lo que Apache BooleanUtils' BooleanUtils.isTrue( bool ); lo hace. - nidheeshdas

No tiene absolutamente ningún sentido usar Apache BooleanUtils sobre este modismo. - StaxMan

Cuando usted tiene una boolean puede ser cualquiera true or false. Sin embargo, cuando tienes un Boolean puede ser cualquiera Boolean.TRUE, Boolean.FALSE or null como cualquier otro objeto.

En su caso particular, su Boolean is null y if instrucción desencadena una conversión implícita a boolean que produce el NullPointerException. Es posible que necesite en su lugar:

if(bool != null && bool) { ... }

Respondido el 12 de junio de 12 a las 22:06

Técnicamente un Boolean puede ser cualquier número de instancias verdaderas, no solo Boolean.TRUE. Por ejemplo new Boolean(true). - steve kuo

Lucho por entender por qué if (myBoolean) (dónde myBoolean is Boolean) no genera un error del compilador o al menos una advertencia. Esto es un gotcha seguro. - Josh M.

@JoshM. Esto se debe a que Java hace Boxeo and unboxing de envoltorios: docs.oracle.com/javase/tutorial/java/data/autoboxing.html - Vinicius

@Vinicius seguro, pero el compilador debería hacer el nulo por nosotros en este caso, al menos a través de una advertencia del compilador. - Josh M.

Use el Apache BooleanUtils.

(Si el rendimiento máximo es la prioridad más importante en su proyecto, busque una de las otras respuestas para una solución nativa que no requiera incluir una biblioteca externa).

No reinventes la rueda. Aproveche lo que ya se ha construido y use isTrue():

BooleanUtils.isTrue( bool );

Comprueba si un Boolean el valor es verdadero, manejando null volviendo false.

Si no está limitado a las bibliotecas que tiene "permitido" incluir, hay un montón de excelentes funciones de ayuda para todo tipo de casos de uso, que incluyen Booleans and Strings. Le sugiero que examine las diversas bibliotecas de Apache y vea lo que ya ofrecen.

Respondido 03 Jul 18, 22:07

Reinventar la rueda no parece tan malo cuando la alternativa es usar una librería externa para algo tan básico como esto. - Pablo Manta

@PaulManta Estoy de acuerdo si esto es lo único que harías vez use en las bibliotecas de Apache Utils, pero la idea sugerida es "examinar" las bibliotecas para exponerse a otras funciones útiles. - Josué pinter

Esa La biblioteca está reinventando la rueda. Intento evitar tales bibliotecas tanto como sea posible. - martín schonaker

@mschonaker Si Apache BooleanUtils está reinventando la rueda, ¿cuál es la original ¿rueda? La idea es evitar crear un montón de funciones auxiliares que imiten lo que ya se ha hecho en bibliotecas como esta. yo también uso toStringYesNo de esta biblioteca en todas mis aplicaciones. - Josué pinter

¿No sería la rueda original? Boolean.TRUE.equals(bool)? Definitivamente hay algunos métodos útiles en BooleanUtils, pero no lo necesitas para esto. - nnnnnn

O con el poder de Java 8 Opcional, también puedes hacer ese truco:

Optional.ofNullable(boolValue).orElse(false)

:)

Respondido 30 Jul 19, 23:07

Esta respuesta debería obtener más reconocimiento, pero esa es solo mi opinión. - Roshan Upreti

Boolean los tipos pueden ser null. Necesitas hacer un null verifique como lo ha configurado para null.

if (bool != null && bool)
{
  //DoSomething
}                   

Respondido 01 Jul 17, 17:07

Boolean es la clase contenedora de objetos para el booleano primitivo. Esta clase, como cualquier clase, puede ser nula. Por razones de rendimiento y memoria, siempre es mejor usar la primitiva.

Las clases contenedoras en la API de Java tienen dos propósitos principales:

  1. Proporcionar un mecanismo para "envolver" valores primitivos en un objeto para que los primitivos puedan incluirse en actividades reservadas para objetos, como agregarse a colecciones o devolverse desde un método con un valor de retorno de objeto.
  2. Proporcionar una variedad de funciones de utilidad para primitivas. La mayoría de estas funciones están relacionadas con varias conversiones: conversión de primitivas hacia y desde objetos String, y conversión de primitivas y objetos String hacia y desde diferentes bases (o base), como binario, octal y hexadecimal.

http://en.wikipedia.org/wiki/Primitive_wrapper_class

Respondido el 12 de junio de 12 a las 23:06

como su variable bool apunta a un valor nulo, siempre obtendrá una NullPointerException, primero debe inicializar la variable en algún lugar con un valor no nulo y luego modificarla.

Respondido el 12 de junio de 12 a las 22:06

Si fuera solo eso, el catch bloque manejaría la NullPointerException. El problema aquí es que el OP intenta desempaquetar una referencia nula en una primitiva. - mike adler

"tú siempre" - No siempre, a excepción de la muestra, código simplificado que no hace nada entre inicializar la variable para null y luego probarlo. Presumiblemente, el código real no sería tan simple o la totalidad if La prueba podría ser eliminada. - nnnnnn

if (bool) será compilado como if (bool.booleanValue()) y eso arrojaría un NPE if bool is null.

Otras soluciones para la evaluación booleana en caja anulable:

  • JDK 9+

    import static java.util.Objects.requireNonNullElse;
    
    if (requireNonNullElse(bool, false)) {
        // DoSomething
    
  • Google guayaba 18+

    import static com.google.common.base.MoreObjects.firstNonNull;
    
    if (firstNonNull(bool, false)) {
        // DoSomething
    

false se utiliza para el caso nulo aquí.

Respondido 20 Jul 21, 10:07

Objects.equals ()

No hay nada de malo en la respuesta aceptada por K-ballo. Si prefiere una sola condición simple y, como yo, no le gustan las condiciones de Yoda, desde Java 1.7 la respuesta es

    if (Objects.equals(bool, true)) {

o si al mismo tiempo prefieres ser muy explícito

    if (Objects.equals(bool, Boolean.TRUE)) {

O mejor: evita el tema

No se recomienda usar Boolean objetos permitiendo así un Boolean referencia a ser null en primer lugar. El riesgo de un NullPointerException como el que viste es demasiado grande. Si necesita un tipo de lógica de tres estados, es mejor definir una enumeración con tres valores. Por ejemplo

enum MyTristateBoolean { FALSE, DONT_KNOW, TRUE }

Ahora no necesitamos null en absoluto. La constante del medio probablemente debería llamarse UNKNOWN, UNDEFINED, NOT_EXISTING o algo más dependiendo de su situación exacta. Incluso puedes nombrarlo NULL si es apropiado. Ahora, dependiendo del gusto, su comparación se convierte en una de las dos siguientes.

    if (myBool.equals(MyTristateBoolean.TRUE)) {

    if (myBool == MyTristateBoolean.TRUE) {

Este último funciona ya que el compilador garantiza que solo tendrá una instancia de cada constante de enumeración. Como la mayoría de ustedes saben == no funciona para comparar objetos de tipo no enumerado para la igualdad.

Respondido el 08 de diciembre de 21 a las 22:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.