web-dev-qa-db-ja.com

ブール!= false

Javaでは、通常、あなたは言うでしょう

if(someBool != false)

と同じです

if(someBool)

しかし、someBoolboolean型ではなくBoolean型ではなく、その値がnullである場合はどうでしょうか。

33

NullPointerExceptionをスローします( autounboxing of null throws NPE)。

しかし、それはnull値を許可してはならないことを意味するだけです。デフォルトを使用するか、自動ボックス化解除を使用せず、null以外のチェックを行います。ブール値のnull値を使用すると、2つではなく3つの値を持つことになります。 (それを処理するより良い方法は、マイケルとトビアスクによって提案されました)

48
Bozho

プリミティブと同様にBooleanインスタンスを処理し、nullセーフにしたい場合、これを使用できます:

if(Boolean.TRUE.equals(someBool))
114

ApacheCommons BooleanUtils.isTrue()または.isFalse()を使用します

21
Tobias

someBoolBooleanの場合

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

ブール値はnullになる可能性があるため、nullでないことを確認してNullPointerExceptionを避けるようにしてください。

3
Buhake Sindi

私は少しテストをしました:

    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");
3

ただし、nullブール値とブール値インスタンスを比較できます。例えば ​​:

Boolean myBool = null;
System.out.println(myBool == Boolean.FALSE);
System.out.println(myBool == Boolean.TRUE);

プリント:

false
false
2
njzk2

Java 7+の場合、使用できます

import Java.util.Objects;

そして

if (Objects.equals(someBool, true))
0
Kohei Nozaki

実際、ブールコンストラクターは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>
0
nickl-

古いですが、Boolean.valueOf(null)falseです。Boolean.valueOf(false)falseと同じです。

0
Dave

プリミティブbooleanとオブジェクトBooleanの違いの良い例です。前者はtrueまたはfalseのみです。後者はtruefalse、またはnknown/undefinedです。 (つまり、null)。どちらを使用するかは、2つのユースケースと3つのユースケースのどちらを扱うかによって異なります。

0
aksarben