web-dev-qa-db-ja.com

Javaでnull値をチェックする最良の方法は?

オブジェクトの関数を呼び出す前に、NullPointerExceptionがスローされないように、オブジェクトがnullかどうかを確認する必要があります。

これについて行く最善の方法は何ですか?これらの方法を検討しました。
Javaのプログラミングのベストプラクティスはどれですか。

// Method 1
if (foo != null) {
    if (foo.bar()) {
        etc...
    }
}

// Method 2
if (foo != null ? foo.bar() : false) {
    etc...
}

// Method 3
try {
    if (foo.bar()) {
        etc...
    }
} catch (NullPointerException e) {
}

// Method 4 -- Would this work, or would it still call foo.bar()?
if (foo != null && foo.bar()) {
    etc...
}
29
Arty-fishL

方法4が最適です。

if(foo != null && foo.bar()) {
   someStuff();
}

短絡評価 を使用します。つまり、logical ANDの最初の条件がfalseの場合に終了します。

59
Jared Nielsen

最後で最高のもの。つまり、LOGICAL AND

  if (foo != null && foo.bar()) {
    etc...
}

論理的に&&

右側が何であるかを知る必要はありません、結果は偽でなければなりません

読むことを好む: Java論理演算子の短絡

11
Suresh Atta

Java 8では、nullをチェックする最良の方法は次のとおりです。

Objects.isNull(obj) //returns true if the object is null

Objects.nonNull(obj) //returns true if object is not-null

if(Objects.nonNull(foo) && foo.something()) // Uses short-circuit as well. No Null-pointer Exceptions are thrown.

これとは別に...グアバのオプションクラスも利用できます

前の回答で説明したように、常にtrueを返す(obj=null)などの類型エラーを減らします。

7
Mohamed Anees A
  • NullPointerExceptionをキャッチしないでください。それは悪い習慣です。値がnullでないことを確認することをお勧めします。
  • 方法#4が有効です。 Javaに短絡があるため、2番目の条件は評価されません(つまり、ブール式の最終結果が変更されない場合、後続の条件は評価されません)。この場合、論理ANDの最初の式がfalseと評価される場合、後続の式を評価する必要はありません。
5
Vivin Paliath

方法4は、何が起こるかを明確に示し、最小限のコードを使用するため、はるかに優れています。

方法3は、すべてのレベルで間違っています。アイテムがnullである可能性があるので、例外的な状況ではないことを確認してください。

方法2は、必要以上に複雑にしています。

方法1は、コード4を追加した方法4です。

4
wobblycogs

方法4は、私が見たコードの最も一般的なイディオムだと思います。しかし、これはいつも少し臭い気がします。 foo == nullはfoo.bar()== falseと同じであると想定しています。

それは常に私にとって正しいとは限りません。

2
DaveH

方法4は私の好みの方法です。 &&演算子の短絡により、コードが最も読みやすくなります。方法3、NullPointerExceptionをキャッチする方法は、ほとんどの場合、単純なnullチェックで十分な場合に眉をひそめます。

2
aglassman

Java 7では、Objects.requireNonNull()を使用できます。 Java.utilからObjectsクラスのインポートを追加します。

public class FooClass {
    //...
    public void acceptFoo(Foo obj) {
        //If obj is null, NPE is thrown
        Objects.requireNonNull(obj).bar(); //or better requireNonNull(obj, "obj is null");
    }
    //...
}
2
KrishPrabakar

他の人が言ったように、ライブラリメソッドを使用しないときは#4が最良の方法です。ただし、タイプミスの場合に誤ってnullをfooに割り当てないように、常に比較の左側にnullを配置する必要があります。その場合、コンパイラは間違いを見つけます。

// You meant to do this
if(foo != null){

// But you made a typo like this which will always evaluate to true
if(foo = null)

// Do the comparison in this way
if(null != foo)

// So if you make the mistake in this way the compiler will catch it
if(null = foo){

// obviously the typo is less obvious when doing an equality comparison but it's a good habit either way
if(foo == null){
if(foo =  null){
1
Jay Eskandarian

チェックがnullまたは空の場合は、StringUtils.isNoneEmpty("")を使用することもできます。

1
Durgpal Singh

呼び出されるAPIを制御する場合は、 GuavaのOptionalクラス の使用を検討してください

詳細 こちら 。メソッドを変更して、BooleanではなくOptional<Boolean>を返すようにします。

これは、Optionalの便利なメソッドの1つを呼び出すことで、nullの可能性を考慮する必要があることを呼び出し元のコードに通知します

1
Sam Barnum

二重に等しい「==」でチェックする場合は、次のようなオブジェクト参照でnullをチェックしてください

if(null == obj) 

の代わりに

if(obj == null)

単一の等式if(obj = null)を誤って入力すると、trueが返されます(オブジェクトを割り当てると成功(値が 'true')が返されます)。

1
user3107979

commons Apacheライブラリへのアクセス権がない場合は、おそらく次のように動作します

if(null != foo && foo.bar()) {
//do something
}
0
Cyril Deba

Nullをチェックする単純な1行のコード:

namVar == null ? codTdoForNul() : codTdoForFul();
0
Sujay U N

ObjectクラスのObject.requireNonNull静的メソッドを使用できます。実装は以下です

public void someMethod(SomeClass obj) {
    Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}
0
Akash Nema

あなたの最後の提案が最高です。

if (foo != null && foo.bar()) {
    etc...
}

なぜなら:

  1. 読みやすいです。
  2. 安全です:foo == nullの場合、foo.bar()は実行されません。
  3. NullPointerExceptionsをキャッチするなどの悪い習慣を防ぎます(ほとんどの場合、コードのバグが原因です)
  4. それは他の方法と同じくらい速く、さらにはもっと速く実行する必要があります(気づくことはほとんど不可能だと思いますが)。
0
C.Champagne