web-dev-qa-db-fra.com

Boolean! = False

En Java, vous diriez généralement que

if(someBool != false)

est le même que

if(someBool)

Mais que se passe-t-il si someBool n'est pas de type boolean mais Boolean et que sa valeur est null?

33
Bart van Heukelom

Il lancera une NullPointerException ( autounboxing of null jette NPE).

Mais cela signifie seulement que vous ne devez pas autoriser une valeur null. Utilisez une valeur par défaut ou n'utilisez pas la boîte automatique et effectuez une vérification non nulle. Parce que l'utilisation d'une valeur null d'un booléen signifie que vous avez 3, pas 2 valeurs. (Michael et Tobiask ont ​​proposé de meilleures méthodes de traitement)

48
Bozho

Si vous voulez gérer les instances Boolean ainsi que les primitives et être null-safe, vous pouvez utiliser ceci:

if(Boolean.TRUE.equals(someBool))
111
Michael Borgwardt

Utilisez ApacheCommons BooleanUtils.isTrue () ou .isFalse ()

21
Tobias

Si someBool est Boolean 

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

Etant donné que Boolean peut être null, assurez-vous d'éviter NullPointerException en vérifiant que rien n'est nul.

3
Buhake Sindi

J'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 surprenante:

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

Le premier NPE est à prévoir, car o sera automatiquement placé en boîte (et cela échoue car il est nul). La seconde se produit pour la même raison, mais cela ne semble pas naturel. Quoi qu'il en soit, la solution consiste à faire:

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

Vous pouvez toutefois comparer un booléen nul à une instance booléenne. Par exemple :

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

impressions:

false
false
2
njzk2

Si c'est Java 7+, vous pouvez utiliser

import Java.util.Objects;

Et

if (Objects.equals(someBool, true))
0
Kohei Nozaki

En réalité, le constructeur booléen accepte null, renvoie FALSE et ne lance pas NullPointerTantrum. 

 new Boolean(null);
 <false>

Cela a l'avantage supplémentaire de donner également une réponse thruthy à la chaîne "true", ce qui n'est pas le cas pour Boolean.TRUE.equals, mais nous sommes encore plus restreints si nous n'avons que des constructeurs pour les chaînes et les booléens. 

Quelque chose que vous puissiez surmonter avec la concaténation de chaînes, qui est également à l'abri de toute é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, disponibles en Java, demeurent.

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

 new Boolean(""+"true");
 <true>
0
nickl-

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

0
Dave

Bonnes illustrations de la différence entre le primitif boolean & l'objet Boolean . Le premier peut être seulement vrai ou faux . Ce dernier peut être vrai , faux ou inconnu/indéfini . (c'est-à-dire nul). Ce que vous utilisez dépend de savoir si vous voulez traiter deux cas d'utilisation ou trois.

0
aksarben