210

次のコードがあります。

Boolean bool = null;

try 
{
    if (bool)
    {
        //DoSomething
    }                   
} 
catch (Exception e) 
{
    System.out.println(e.getMessage());             
}

ブール変数「bool」をチェックすると例外が発生するのはなぜですか? それが真実ではないことを「見た」ときに、ifステートメントを通り越してジャンプするべきではありませんか? if ステートメントを削除するか、NULL でないかどうかを確認すると、例外はなくなります。

4

9 に答える 9

509

余分な null チェックが気に入らない場合:

if (Boolean.TRUE.equals(value)) {...}
于 2013-09-13T15:36:34.273 に答える
193

を持っている場合、 または のbooleanいずれtrueかになりますfalse。しかし、あなたが持っているとき、BooleanそれはBoolean.TRUEBoolean.FALSEまたはnull他のオブジェクトとしてのいずれかです。

あなたの特定のケースでは、Booleanisnullであり、ifステートメントは への暗黙的な変換をトリガーしbooleanNullPointerException. 代わりに次のものが必要になる場合があります。

if(bool != null && bool) { ... }
于 2012-06-12T21:42:26.910 に答える
100

Apache BooleanUtilsを使用します。

(プロジェクトでピーク パフォーマンスが最も重要な優先事項である場合は、外部ライブラリを含める必要がないネイティブ ソリューションの他の回答のいずれかを参照してください。)

車輪を再発明しないでください。すでに構築されているものを活用して使用しますisTrue():

BooleanUtils.isTrue( bool );

Boolean値が trueかどうかをチェックし、 をnull返すことで処理しfalseます。

含めることが「許可されている」ライブラリに限定されていない場合は、BooleansおよびStrings. さまざまな Apache ライブラリを熟読し、それらがすでに提供しているものを確認することをお勧めします。

于 2014-05-09T01:51:14.917 に答える
16

Booleanの種類がありますnullnullに設定しているので、チェックを行う必要がありますnull

if (bool != null && bool)
{
  //DoSomething
}                   
于 2012-06-12T21:42:28.777 に答える
5

Boolean は、プリミティブ boolean のオブジェクト ラッパー クラスです。このクラスは、他のクラスと同様に、実際には null になる可能性があります。パフォーマンスとメモリの理由から、常にプリミティブを使用することをお勧めします。

Java API のラッパー クラスは、主に次の 2 つの目的を果たします。

  1. プリミティブ値をオブジェクトに「ラップ」するメカニズムを提供して、オブジェクト用に予約されたアクティビティにプリミティブを含めることができるようにする (コレクションに追加する、またはオブジェクトの戻り値を持つメソッドから返すなど)。
  2. プリミティブにさまざまなユーティリティ関数を提供します。これらの関数のほとんどは、さまざまな変換に関連しています。プリミティブと String オブジェクトとの間の変換、およびプリミティブと String オブジェクトと、2 進数、8 進数、16 進数などの異なる基数 (または基数) との間の変換です。

http://en.wikipedia.org/wiki/Primitive_wrapper_class

于 2012-06-12T22:14:34.147 に答える
1

変数boolがnullを指しているため、常にNullPointerExceptionが発生します。最初に変数をnull以外の値で初期化してから、変更する必要があります。

于 2012-06-12T21:48:37.813 に答える