Question

En Java, vous auriez l'habitude de dire que

if(someBool != false)

est le même que

if(someBool)

Mais si someBool est pas de type boolean mais Boolean, et sa valeur est null?

Était-ce utile?

La solution

Il lancera un NullPointerException ( autounboxing null de jets NPE).

Mais cela signifie seulement que vous ne devez pas permettre à une valeur de null. Soit utiliser un défaut, ou ne pas utiliser autounboxing et faire un chèque non nul. Parce que l'utilisation d'une valeur null d'un moyen booléennes vous avez 3, pas 2 valeurs. (De meilleures façons de manipuler ont été proposées par Michael et Tobiask)

Autres conseils

Si vous voulez gérer les instances de Boolean ainsi que des primitives et nulle de sécurité, vous pouvez utiliser ceci:

if(Boolean.TRUE.equals(someBool))

Utilisation Apache Commons BooleanUtils.isTrue () ou .isFalse ()

Si someBool est Boolean

if (someBull != null && someBull) {
  //Yeah, true.
}

Comme booléenne peut être faire de null que vous éviter NullPointerException en vérifiant non nulle.

Je l'ai fait un petit test:

    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 sortie est surprenant:

java.lang.NullPointerException
    at btest.main(btest.java:10)
java.lang.NullPointerException
    at btest.main(btest.java:15)

La première NPE est à prévoir, car o sera autounboxed (et qui échoue parce qu'il est nul). Le second se produit pour la même raison, mais il ne se sent pas naturel. Quoi qu'il en soit, la solution est de faire:

System.out.println(!Boolean.FALSE.equals(o) ? "yes" : "no");

Vous pouvez cependant comparer une valeur nulle Boolean avec une instance booléenne. Par exemple:

Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);

impressions:

false
false

Les bonnes illustrations de la différence entre la primitive boolean et l'objet Boolean . Le premier peut être que true ou false . Ce dernier peut être true , false ou inconnu / non défini . (À savoir, null). Que vous utilisez dépend si vous voulez traiter deux cas d'utilisation ou trois.

Il est vieux, mais Boolean.valueOf(null) est false, tout comme Boolean.valueOf(false) est false.

En fait, le constructeur accepte Boolean null, renvoie FAUX et ne jette pas un NullPointerTantrum.

 new Boolean(null);
 <false>

Ceci a l'avantage supplémentaire de donner également une réponse thruthy à la "true" chaîne qui n'est pas le cas pour Boolean.TRUE.equals mais nous sommes plus restreint encore avoir seulement les constructeurs pour cordes et booléens.

Quelque chose que vous pouvez surmonter avec concaténation de chaîne, qui est également nulle épreuve.

 new Boolean(""+null);
 <false>

 new Boolean(""+false);
 <false>

 new Boolean(""+new Object());
 <false>

 new Boolean(""+6);
 <false>

 new Boolean(""+new Integer(9));
 <false>

Veiller à ce que toutes les options TRUE, disponible en java, reste encore.

 new Boolean(""+true);
 <true>

 new Boolean(""+"true");
 <true>

Si elle est Java 7+ vous pouvez utiliser

import java.util.Objects;

if (Objects.equals(someBool, true))

As Boolean vous donnera un objet, vous devez toujours vérifier pour NULL avant de travailler sur l'objet

Si son null vous aurez un NullPointerException

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top