web-dev-qa-db-ja.com

NULLおよびプリミティブ値0に対する整数ラッパーのチェック

この質問を投稿する前に、これを参照しました。
プリミティブ値に対するNullラッパーのチェック

そして、私がチェックしたい状況がありますWrapper Integer withnull0

if( statusId != null || statusId != 0 ) //statusId is Integer it maybe 0 or null
    // Do Somethimg here

どうすればこの状況を克服できますか?

6
Shantaram Tupe

orandに置き換えます。

if( statusId != null && statusId != 0 ) 

statusIdnullでない場合にのみ機能します:

statusId != null

statusIdからintへの開封を試みます。

statusId != 0 

また、statusIdnullの場合、&&が評価されないため、短絡したstatusId != 0演算子はNullPointerExceptionをスローできなくなります。 。

7
davidxxx

問題は、nullを2番目のチェックに通し、nullポインターを取得していることです。

同等の動作ロジック:

if (!(statusId == null || statusId == 0)) {
}
1
David Lavender

nullチェックを削除したい場合は、equalsを使用できます。例:

Integer i = null;
if(Integer.valueOf(0).equals(i)){
    System.out.println("zero");
}else{
    System.out.println("not zero");
}
1
Darshan Mehta

良い 'クラシック' Javaの答えはすでにこのスレッドにたくさんあるので、それのために...ここにJava 8 1つ:使用- OptionalInt

statusIdOptionalIntであるとすると、次のように記述します。

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コード。チェックしてみてください。Optionalfilter および map メソッド。

0
user268396

この質問がなぜそんなに痛いのかを理解しました。それは実際にはタイプミスについてです(もしそうなら、@ davidxxxの答えは正しいです)。それは論理的等価性についてではありません。

しかし、それが価値があるもののために。質問は具体的に尋ねます:

if( statusId != null || statusId != 0 )

つまり、「nullでない場合」、または「ゼロでない場合」になります。

したがって、実際には、解決策は次のとおりです。

if (true)
0
David Lavender

正確なコンテキストはわかりませんが、Apache CommonsLangのnullセーフメソッドを検討できます。

if (ObjectUtils.defaultIfNull(statusId, 0) != 0)
  // Do Somethimg here
0