En Java, vous diriez généralement queBoolean! = False
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
?
En Java, vous diriez généralement queBoolean! = False
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
?
Il lancera un NullPointerException
(autounboxing de null
lancers francs 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, et non 2 valeurs. (De meilleures façons de manipuler ont été proposés par Michael et Tobiask)
+1 pour répondre réellement à la question. – cHao
Utilisez BooleanUtils.isTrue Apache Commons() ou .isFalse()
C'est une excellente façon de faire. Les bibliothèques ApacheCommons font de la programmation Java un véritable plaisir. –
As Boolean vous donnera un objet, vous devez toujours vérifier pour NULL avant de travailler sur l'objet
Si vous voulez gérer Boolean
cas ainsi que primitives et nulle de sécurité, vous pouvez utiliser ceci:
if(Boolean.TRUE.equals(someBool))
Ou si vous voulez faire quelque chose quand someBool est 'null','! Boolean.FALSE.equals (someBool) ' –
@Bart' Boolean.FALSE.equals (null) 'retournera' false' - votre déclaration ne exactement la même chose que la réponse de Michael. – Jesper
@Jesper: Non. '! Boolean.FALSE.equals (null)' renvoie 'true' tandis que' Boolean.TRUE.equals (null) 'renvoie' false'. Cependant, cela démontre bien que les doubles négations sont difficiles à analyser mentalement et sont donc à éviter. –
Si someBool
est Boolean
if (someBull != null && someBull) {
//Yeah, true.
}
Depuis Boolean peut être null
assurez-vous d'éviter NullPointerException
en recherchant non null.
Si son null vous aurez un NullPointerException
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 , parce que o sera autounboxed (et cela échoue parce que c'est nul). Le second arrive pour la même raison, mais il 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 éviter la double négation en disant 'Boolean.TRUE.equals (o)' –
@ChrisParton non, vous ne pouvez pas actuellement. Voir les commentaires sur Michael Borgwardt réponse pour la différence dans le cas nul – Zavael
bonnes illustrations de la différence entre la primitive booléenne & l'objet booléenne. Le premier peut être seulement vrai ou faux. Ce dernier peut être vrai, faux ou inconnu/indéfini. (c'est-à-dire, null). Ce que vous utilisez dépend de si vous voulez traiter deux cas d'utilisation ou trois.
Malheureusement, il y a d'autres raisons que l'on voudrait utiliser Boolean, par exemple stocker les valeurs d'une collection d'objets. Dans ce cas, vous devez traiter les trois cas d'utilisation, que vous les vouliez ou non. –
Vous pouvez toutefois comparer une valeur booléenne nulle à une instance booléenne.Par exemple:
Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);
impressions:
false
false
Cela ne fonctionnera pas si je crée un booléen avec new, cela ne fonctionnera que lorsque [valueOf] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147 /java/lang/Integer.java#Integer.valueOf%28int%29) et éventuellement autoboxing est utilisé 'assertThat (new Boolean (true) == Boolean.TRUE, est (true));' ce test ne passe pas. .. – stivlo
@stivlo: J'aurais bien que les Booléens (et tous les objets représentant la primitive) auraient été dans une forme de pool et considérés comme égaux. Merci pour le commentaire, j'ai appris quelque chose aujourd'hui. – njzk2
utilisez 'Boolean.TRUE.equals (myBool)' ou 'Boolean.FALSE.equals (myBool)' à la place. – Dallas
Il est vieux, mais Boolean.valueOf(null)
est false
, tout comme Boolean.valueOf(false)
est false
.
En fait, le constructeur booléen accepte null, retourne FALSE et ne lance pas de NullPointerTantrum.
new Boolean(null);
<false>
Cela a l'avantage de donner également une réponse thruthy à la chaîne "true"
qui 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 la concaténation de chaînes, qui est également nulle. Assurez-vous que toutes les options TRUE, disponibles dans java, sont conservées.
new Boolean(""+true);
<true>
new Boolean(""+"true");
<true>
Pourquoi ne pas l'essayer vous-même? – Jesper
@Jesper: Je l'ai fait, voir ma propre réponse ci-dessous –