2010-11-30 41 views
28

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?

+9

Pourquoi ne pas l'essayer vous-même? – Jesper

+0

@Jesper: Je l'ai fait, voir ma propre réponse ci-dessous –

Répondre

42

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)

+0

+1 pour répondre réellement à la question. – cHao

20

Utilisez BooleanUtils.isTrue Apache Commons() ou .isFalse()

+0

C'est une excellente façon de faire. Les bibliothèques ApacheCommons font de la programmation Java un véritable plaisir. –

-1

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

98

Si vous voulez gérer Boolean cas ainsi que primitives et nulle de sécurité, vous pouvez utiliser ceci:

if(Boolean.TRUE.equals(someBool)) 
+0

Ou si vous voulez faire quelque chose quand someBool est 'null','! Boolean.FALSE.equals (someBool) ' –

+0

@Bart' Boolean.FALSE.equals (null) 'retournera' false' - votre déclaration ne exactement la même chose que la réponse de Michael. – Jesper

+7

@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. –

3

Si someBool est Boolean

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

Depuis Boolean peut être null assurez-vous d'éviter NullPointerException en recherchant non null.

3

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"); 
+1

Vous pouvez éviter la double négation en disant 'Boolean.TRUE.equals (o)' –

+0

@ChrisParton non, vous ne pouvez pas actuellement. Voir les commentaires sur Michael Borgwardt réponse pour la différence dans le cas nul – Zavael

0

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.

+1

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. –

2

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 
+3

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

+1

@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

+0

utilisez 'Boolean.TRUE.equals (myBool)' ou 'Boolean.FALSE.equals (myBool)' à la place. – Dallas

0

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

0

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>