Frage
In Java, würden Sie in der Regel sagen, dass
if(someBool != false)
ist die gleiche wie
if(someBool)
Was aber, wenn someBool
ist nicht vom Typ boolean
aber Boolean
, und sein Wert ist null
?
Lösung
Es wird eine NullPointerException
werfen ( autounboxing von null
wirft NPE).
Aber das einzige Mittel, dass Sie keine null
Wert zulassen. Entweder eine Standard verwenden, oder verwenden Sie kein autounboxing und einen Nicht-Null-Check machen. einen null
Wert einer Booleschen Mittel Weil verwenden Sie 3 haben, nicht mehr als 2 Werte. (Bessere Wege im Umgang mit ihm von Michael und Tobiask vorgeschlagen wurde)
Andere Tipps
Wenn Sie Boolean
Instanzen sowie Primitiven zu handhaben wollen und sein Null sicher, können Sie diese verwenden:
if(Boolean.TRUE.equals(someBool))
Verwenden Sie Apache Commons BooleanUtils.isTrue () oder .isFalse ()
Wenn someBool
ist Boolean
if (someBull != null && someBull) {
//Yeah, true.
}
Da Boolean null
make sein kann sicher vermeiden Sie NullPointerException
von für nicht null zu überprüfen.
Ich habe einen kleinen 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();
}
Der Ausgang ist überraschend:
java.lang.NullPointerException
at btest.main(btest.java:10)
java.lang.NullPointerException
at btest.main(btest.java:15)
Der erste NPE ist zu erwarten, weil o autounboxed wird (und das nicht, weil es null). Der zweite Fall aus dem gleichen Grund, aber es nicht natürlich anfühlen. Auf jeden Fall ist die Lösung zu tun:
System.out.println(!Boolean.FALSE.equals(o) ? "yes" : "no");
Sie können jedoch ein Null Boolean mit einer Boolean-Instanz vergleichen. Zum Beispiel:
Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);
druckt:
false
false
Gute Darstellungen der Differenz zwischen dem primitiven boolean & das Objekt Boolean . Ersteres kann nur true oder false sein. Letzteres kann sein true , false oder unbekannt / undefined . (D.h. null). Welche Sie verwenden, hängt davon ab, ob Sie mit zwei Anwendungsfällen oder drei behandeln.
Es ist alt, aber Boolean.valueOf(null)
ist false
, wie Boolean.valueOf(false)
false
ist.
Tatsächlich ist die Boolesche Konstruktor akzeptiert null, false zurückgibt und wirft keine NullPointerTantrum.
new Boolean(null);
<false>
Dies hat den zusätzlichen Bonus auch eine thruthy Antwort auf die Zeichenfolge "true"
geben, die nicht der Fall für Boolean.TRUE.equals
ist, aber wir werden wieder mehr eingeschränkt, die nur Konstrukteure für Streicher und Boolesche Werte.
Etwas, das Sie mit String-Verkettung überwinden können, die auch null sicher ist.
new Boolean(""+null);
<false>
new Boolean(""+false);
<false>
new Boolean(""+new Object());
<false>
new Boolean(""+6);
<false>
new Boolean(""+new Integer(9));
<false>
Um sicherzustellen, dass alle wahren Optionen, verfügbar in Java, noch bleiben.
new Boolean(""+true);
<true>
new Boolean(""+"true");
<true>
Wenn es Java 7+ können Sie
import java.util.Objects;
Und
if (Objects.equals(someBool, true))
As Boolean geben Sie ein Objekt, Sie immer auf NULL überprüfen müssen, bevor auf das Objekt
ArbeitsWenn seine Null dann werden Sie eine Nullpointer bekommen