この質問を投稿する前に、これを参照しました。
プリミティブ値に対するNullラッパーのチェック
そして、私がチェックしたい状況がありますWrapper Integer
withnull
も0
if( statusId != null || statusId != 0 ) //statusId is Integer it maybe 0 or null
// Do Somethimg here
どうすればこの状況を克服できますか?
or
をand
に置き換えます。
if( statusId != null && statusId != 0 )
statusId
がnull
でない場合にのみ機能します:
statusId != null
statusId
からint
への開封を試みます。
statusId != 0
また、statusId
がnull
の場合、&&
が評価されないため、短絡したstatusId != 0
演算子はNullPointerException
をスローできなくなります。 。
問題は、nullを2番目のチェックに通し、nullポインターを取得していることです。
同等の動作ロジック:
if (!(statusId == null || statusId == 0)) {
}
null
チェックを削除したい場合は、equals
を使用できます。例:
Integer i = null;
if(Integer.valueOf(0).equals(i)){
System.out.println("zero");
}else{
System.out.println("not zero");
}
良い 'クラシック' Javaの答えはすでにこのスレッドにたくさんあるので、それのために...ここにJava 8 1つ:使用- OptionalInt
。
statusId
がOptionalInt
であるとすると、次のように記述します。
if(statusId.isPresent() && statusId.getAsInt() != 0)
または、もう少し不可解に、これを行うことができます:
if(statusId.orElse(0) != 0)
このシナリオでは、statusId
がnullに設定されることはありません。代わりに、OptionalInt.of(<some int>)
、OptionalInt.ofNullable(<some Integer>)
またはOptionalInt.empty()
のいずれかに設定されます。
この答えのポイントは、Java 8の時点で、標準ライブラリは便利な Optional
およびプリミティブがnull-safe =を書き込むための関連クラスを提供しているということです。 Javaコード。チェックしてみてください。Optional
は filter
および ( map
メソッド。
この質問がなぜそんなに痛いのかを理解しました。それは実際にはタイプミスについてです(もしそうなら、@ davidxxxの答えは正しいです)。それは論理的等価性についてではありません。
しかし、それが価値があるもののために。質問は具体的に尋ねます:
if( statusId != null || statusId != 0 )
つまり、「nullでない場合」、または「ゼロでない場合」になります。
したがって、実際には、解決策は次のとおりです。
if (true)
正確なコンテキストはわかりませんが、Apache CommonsLangのnullセーフメソッドを検討できます。
if (ObjectUtils.defaultIfNull(statusId, 0) != 0)
// Do Somethimg here