Javaでは、通常、あなたは言うでしょう
if(someBool != false)
と同じです
if(someBool)
しかし、someBool
がboolean
型ではなくBoolean
型ではなく、その値がnull
である場合はどうでしょうか。
NullPointerException
をスローします( autounboxing of null
throws NPE)。
しかし、それはnull
値を許可してはならないことを意味するだけです。デフォルトを使用するか、自動ボックス化解除を使用せず、null以外のチェックを行います。ブール値のnull
値を使用すると、2つではなく3つの値を持つことになります。 (それを処理するより良い方法は、マイケルとトビアスクによって提案されました)
プリミティブと同様にBoolean
インスタンスを処理し、nullセーフにしたい場合、これを使用できます:
if(Boolean.TRUE.equals(someBool))
ApacheCommons BooleanUtils.isTrue()または.isFalse()を使用します
someBool
がBoolean
の場合
if (someBull != null && someBull) {
//Yeah, true.
}
ブール値はnull
になる可能性があるため、nullでないことを確認してNullPointerException
を避けるようにしてください。
私は少しテストをしました:
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();
}
出力は驚くべきものです。
Java.lang.NullPointerException
at btest.main(btest.Java:10)
Java.lang.NullPointerException
at btest.main(btest.Java:15)
Oは自動的にアンボックス化されるため、最初のNPEが予想されます(そして、nullであるため失敗します)。 2つ目も同じ理由で起こりますが、自然に感じられません。とにかく、解決策は次のとおりです。
System.out.println(!Boolean.FALSE.equals(o) ? "yes" : "no");
ただし、nullブール値とブール値インスタンスを比較できます。例えば :
Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);
プリント:
false
false
Java 7+の場合、使用できます
import Java.util.Objects;
そして
if (Objects.equals(someBool, true))
実際、ブールコンストラクターはnullを受け入れ、FALSEを返し、NullPointerTantrumをスローしません。
new Boolean(null);
<false>
これには、"true"
には当てはまらない文字列Boolean.TRUE.equals
にも完全な応答を与えるという追加のボーナスがありますが、文字列とブール値のコンストラクタのみを持つように制限されています。
文字列の連結で克服できることもありますが、これもヌルプルーフです。
new Boolean(""+null);
<false>
new Boolean(""+false);
<false>
new Boolean(""+new Object());
<false>
new Boolean(""+6);
<false>
new Boolean(""+new Integer(9));
<false>
Javaで使用可能なすべてのTRUEオプションがまだ残っていることを確認します。
new Boolean(""+true);
<true>
new Boolean(""+"true");
<true>
古いですが、Boolean.valueOf(null)
はfalse
です。Boolean.valueOf(false)
はfalse
と同じです。
プリミティブbooleanとオブジェクトBooleanの違いの良い例です。前者はtrueまたはfalseのみです。後者はtrue、false、またはnknown/undefinedです。 (つまり、null)。どちらを使用するかは、2つのユースケースと3つのユースケースのどちらを扱うかによって異なります。