Boolean!= faux

En Java, vous diriez généralement que

if(someBool != false)

Est le même que

if(someBool)

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

30
demandé sur Bart van Heukelom 2010-11-30 15:04:35

12 réponses

Il va lancer un NullPointerException (autounboxing de null lance NPE).

Mais cela signifie seulement que vous ne devez pas autoriser une valeur null. Utilisez une valeur par défaut ou n'utilisez pas autounboxing 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. (De meilleures façons de le gérer ont été proposées par Michael et Tobiask)

45
répondu Bozho 2010-11-30 12:08:07

Si vous souhaitez gérer Boolean instances ainsi que les primitives et être null-sûr, vous pouvez utiliser ceci:

if(Boolean.TRUE.equals(someBool))
107
répondu Michael Borgwardt 2010-11-30 12:08:54

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

21
répondu Tobias 2010-11-30 12:06:09

Si someBool est Boolean

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

Puisque booléen peut être null Assurez-vous d'éviter NullPointerException en vérifiant not null.

3
répondu Buhake Sindi 2010-11-30 12:10:07

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 autounboxed (et cela échoue car il est null). La seconde se produit pour la même raison, mais cela ne semble pas naturel. Quoi qu'il en soit, la solution est de faire:

System.out.println(!Boolean.FALSE.equals(o) ? "yes" : "no");
3
répondu Bart van Heukelom 2010-11-30 12:10:58

Vous pouvez cependant comparer un booléen nul 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
2
répondu njzk2 2013-05-27 08:51:18

Une Bonne illustration de la différence entre le primitif boolean & l'objet Boolean. La première peut être seule true ou false. Ce dernier peut être vrai, faux - , ou inconnu/non défini. (c'est-à-dire null). Ce que vous utilisez dépend si vous voulez traiter deux cas d'utilisation ou trois.

0
répondu aksarben 2010-12-01 16:54:16

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

0
répondu Dave 2017-08-08 18:38:59

En fait, le constructeur booléen accepte null, renvoie FALSE et ne lance pas de 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 en n'ayant que des constructeurs pour les chaînes et les booléens.

Quelque chose que vous pouvez surmonter avec la concaténation de chaînes, qui est également null-proof.

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

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

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

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

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

S'assurer que toutes les vraies options, disponibles en java, reste.

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

 new Boolean(""+"true");
 <true>
0
répondu nickl- 2017-09-02 00:39:59

Si c'est Java 7+ vous pouvez utiliser

import java.util.Objects;

Et

if (Objects.equals(someBool, true))
0
répondu Kohei Nozaki 2018-04-27 21:58:09

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

-1
répondu Gopi 2010-11-30 12:08:11

Si c'est null alors vous obtiendrez une NullPointerException

-2
répondu PaulJWilliams 2010-11-30 12:10:15