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
?
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)
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))
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.
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");
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
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.
, Il est vieux, mais Boolean.valueOf(null)
est false
, comme Boolean.valueOf(false)
est false
.
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>
Si c'est Java 7+ vous pouvez utiliser
import java.util.Objects;
Et
if (Objects.equals(someBool, true))
Boolean vous donnera un objet, vous devez toujours vérifier la valeur NULL avant de travailler sur l'objet
Si c'est null alors vous obtiendrez une NullPointerException