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
?
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)
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))
Utilisez ApacheCommons BooleanUtils.isTrue () ou .isFalse ()
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.
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");
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
Si c'est Java 7+, vous pouvez utiliser
import Java.util.Objects;
Et
if (Objects.equals(someBool, true))
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>
C'est vieux, mais Boolean.valueOf(null)
est false
, tout comme Boolean.valueOf(false)
est false
.
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.