【Java】nullを判定する方法|== null・Objects.isNull・requireNonNull

【Java】isNullでnullの判定を行う方法 Java

Javaで null のオブジェクトにアクセスすると NullPointerException が起きるため、事前のnull判定は重要です。判定方法には obj == nullObjects.isNull() があり、場面によって使い分けます。この記事で正しい使い分けと、null対策の関連メソッドを解説します。

この記事の結論:直接のnull判定は obj == null が定番で最も明快です。Objects.isNull()(Java 8で追加)は、主にStreamの filter(Objects::isNull) のようなメソッド参照で活躍します。引数のnullチェックには Objects.requireNonNull() が便利です。
スポンサーリンク

基本:obj == null で判定する

最も基本的で明快なのが == null による比較です。直接のnull判定なら、これで十分です。

== null(直接判定の定番)
Object obj = getValue();

if (obj == null) {
    System.out.println("null です");
} else {
    System.out.println("値があります");
}

Objects.isNull / nonNull(Java 8)

java.util.ObjectsisNull() は、nullなら true を返します(Java 8で追加)。結果は obj == null と同じです。逆に「nullでない」は nonNull() です。

Objects.isNull / nonNull
import java.util.Objects;

Object obj = null;
System.out.println(Objects.isNull(obj));  // true(obj == null と同じ)
System.out.println(Objects.nonNull(obj)); // false
単純なif文での判定なら obj == null の方が簡潔で読みやすいです。Objects.isNull() の本領は、次に示すようにStreamのメソッド参照として使えることにあります。

Stream APIでのnullフィルタリング

Objects::isNull / Objects::nonNullメソッド参照として渡せるため、Streamでnull要素を除外・抽出するのに便利です。

nullを除外する / nullを数える
import java.util.*;
import java.util.stream.*;

List<String> list = Arrays.asList("Apple", null, "Orange", null, "Banana");

// null を除外した新しいリスト
List<String> notNull = list.stream()
    .filter(Objects::nonNull)
    .collect(Collectors.toList()); // [Apple, Orange, Banana]

// null の数を数える
long nullCount = list.stream().filter(Objects::isNull).count(); // 2
nullに加えて空文字も弾くなど、リスト要素を安全に使う方法はリストの項目が空でないか確認して使う方法で解説しています。

引数のnullチェック:requireNonNull

メソッドやコンストラクタの引数がnullでないことを保証したいときはObjects.requireNonNull() が便利です。nullなら即座に NullPointerException を投げる(fail-fast)ため、問題を早く・分かりやすく検出できます。

requireNonNullでfail-fast
import java.util.Objects;

public class User {
    private final String name;

    public User(String name) {
        // null なら分かりやすいメッセージ付きで即例外
        this.name = Objects.requireNonNull(name, "name は必須です");
    }
}

そもそもnullを避ける:Optional

「値が無いかもしれない」ことを表すなら、nullの代わりに Optional を使う方法もあります。isPresent()(値がある)/ isEmpty()(Java 11+、値が無い)で判定します。

Optionalで値の有無を表す
import java.util.Optional;

Optional<String> opt = Optional.ofNullable(getValue());

if (opt.isPresent()) {
    System.out.println(opt.get());
}
// 既定値を使う(null判定の代わり)
String value = opt.orElse("デフォルト");

よくある質問(FAQ)

Qobj == null と Objects.isNull はどちらを使うべきですか?
A単純なif文での判定は obj == null が簡潔で明快です。Objects.isNull() は、Streamの filter(Objects::isNull) のようにメソッド参照として渡す場面で活躍します。
QObjects.isNullはいつから使えますか?
AJava 8からです(Objects クラス自体はJava 7ですが、isNull / nonNull メソッドはJava 8で追加されました)。
Q引数がnullのときに早めにエラーにしたいです。
AObjects.requireNonNull(arg, "メッセージ") を使います。nullなら即座に NullPointerException を投げるため、どこでnullが渡されたかを早く特定できます(fail-fast)。
Qnullを返さない設計にしたいです。
AOptional を使い、「値が無い」ことを型で表現します。受け取り側は isPresent() / orElse() などで安全に扱えます。

まとめ

Javaのnull判定のポイントを整理します。

  • 直接の判定は obj == null が定番で明快
  • Objects.isNull() / nonNull()Java 8)はStreamのメソッド参照で活躍
  • 引数のnullチェックは Objects.requireNonNull()(fail-fast)
  • そもそもnullを避けるなら Optional

関連として、リストの項目が空でないか確認する方法isEmptyメソッドの使い方boolean型で条件判定をする方法もあわせて読むと、Javaの判定・null安全に強くなれます。