Java Tips | 基本ユーティリティ:Nullチェック

Java Java
スポンサーリンク

業務で必須になる「nullチェック」とは何か

Java で業務システムを書くとき、「nullチェック」は避けて通れません。
null は「まだ何も入っていない参照」を表す特別な値で、オブジェクト型の変数なら基本的にどれでも null になり得ます。

null のままメソッドを呼び出したり、フィールドにアクセスすると、あの有名な NullPointerException(NPE)が発生して、処理が途中で止まります。
業務システムだと「画面が真っ白」「バッチが途中で落ちる」「データが中途半端に保存される」など、かなり致命的な結果になります。

ここで大事なのは、

  • 「どこで null があり得るのか」を意識すること
  • null かもしれない値」に対して、必ず何らかの対処をすること

この2つです。


まずは基本:if 文での null チェック

一番素朴な null チェック

いちばん基本の形はこれです。

String name = getUserName(); // どこかから名前を取得

if (name == null) {
    System.out.println("名前が設定されていません");
} else {
    System.out.println("こんにちは、" + name + "さん");
}
Java

== null で「値がない」、!= null で「値がある」と判断します。
初心者のうちは、まずこの形を「反射的に書ける」レベルまで慣れるのが大事です。

ありがちな初心者ミス

String name = null;

if (name.equals("山田")) {   // ← ここで NPE
    System.out.println("山田さんです");
}
Java

namenull の可能性があるのに、いきなり name.equals(...) を呼んでしまうと NPE になります。

安全に書くならこうです。

String name = null;

if ("山田".equals(name)) {   // リテラル側から equals を呼ぶ
    System.out.println("山田さんです");
}
Java

"山田" は絶対に null にならないので、"山田".equals(name) なら namenull でも NPE になりません。
この書き方は、現場でもよく使われる「小さなテクニック」です。


実務でよく使う null チェックユーティリティ

Objects クラスを使った null チェック

Java 7 以降には、java.util.Objects という便利クラスがあります。
ここに「null チェック専用」と言っていいメソッドがいくつか用意されています。

import java.util.Objects;

String name = getUserName();

if (Objects.isNull(name)) {
    System.out.println("名前が null です");
}

if (Objects.nonNull(name)) {
    System.out.println("名前は null ではありません");
}
Java

Objects.isNull(obj)obj == null と同じ意味、
Objects.nonNull(obj)obj != null と同じ意味です。

ストリーム API などと組み合わせるときに、メソッド参照として使えるのが特に便利です。

list.stream()
    .filter(Objects::nonNull)  // null を除外
    .forEach(System.out::println);
Java

Objects.requireNonNull で「必須パラメータ」を守る

業務コードでめちゃくちゃよく使うのが Objects.requireNonNull です。

「ここに渡される値は絶対に null であってはならない」という場面で使います。

import java.util.Objects;

public class UserService {

    public void registerUser(String name) {
        Objects.requireNonNull(name, "name は必須です");

        // ここまで来た時点で name は null ではない
        System.out.println("ユーザー登録: " + name);
    }
}
Java

namenull の場合、NullPointerException が投げられ、そのメッセージに "name は必須です" が入ります。

なぜ「わざと例外を投げる」のか

初心者のうちは「例外を投げるなんて悪いことでは?」と感じるかもしれません。
でも業務システムでは、「ダメな状態のまま処理を続ける」ほうが危険です。

  • 必須の値が null なのに、そのまま DB に保存してしまう
  • 画面に中途半端な情報を出してしまう
  • 後続処理で、もっと分かりにくいバグになる

こうなるくらいなら、「その場で落ちてくれたほうがマシ」です。
Objects.requireNonNull は、「ここは null 禁止だよ」という設計をコードで明示するための道具です。


Optional を使った「null を表現する」設計

Optional とは何か

Java 8 で導入された Optional<T> は、「あるかもしれないし、ないかもしれない値」を表現するためのクラスです。

import java.util.Optional;

public Optional<String> findUserName(Long id) {
    String name = ...; // DB から取得したりする

    return Optional.ofNullable(name);
}
Java

Optional.ofNullable(value) は、valuenull なら「空の Optional」、null でなければ「中身ありの Optional」を返します。

Optional の基本的な使い方

Optional<String> nameOpt = findUserName(1L);

// 値があれば表示、なければ「不明」と表示
String label = nameOpt.orElse("不明");
System.out.println("ユーザー名: " + label);
Java

orElse は「中身があればそれを返し、なければデフォルト値を返す」メソッドです。

もう少し踏み込むと、こんな書き方もできます。

nameOpt.ifPresent(name -> {
    System.out.println("こんにちは、" + name + "さん");
});
Java

ifPresent は「値があるときだけ処理を実行する」メソッドです。
null チェックと処理を、1 行でスッキリ書けるのが魅力です。

Optional を使うときの注意点(重要)

Optional は便利ですが、何でもかんでも使えばいいわけではありません。

  • フィールドに Optional を持たせるのは、基本的に推奨されません
  • コレクションの要素に Optional を入れ子にするのも、あまり良くありません
  • 「内部実装」で使うより、「メソッドの戻り値」で使うことが多いです

特に業務コードでは、「このメソッドは値がないこともあるよ」ということを、
戻り値の型で表現したいときに Optional が活きてきます。


自作ユーティリティで「現場の型」をそろえる

よくあるパターンを 1 箇所にまとめる

現場では、プロジェクトごとに「null チェックの書き方の流儀」をそろえるために、
自前のユーティリティクラスを用意することもあります。

public final class Nulls {

    private Nulls() {}

    public static boolean isNullOrEmpty(String s) {
        return s == null || s.isEmpty();
    }

    public static String defaultIfNull(String s, String defaultValue) {
        return s != null ? s : defaultValue;
    }
}
Java

こうしておくと、業務コード側はかなり読みやすくなります。

String name = getUserName();

if (Nulls.isNullOrEmpty(name)) {
    name = "名称未設定";
}
Java

null かもしれない」「空文字かもしれない」というチェックを、
毎回 if 文で書くのではなく、1 箇所に集約できるのがポイントです。


実務で意識したい null チェックの「考え方」

1. 「どこまで null を許すか」を決める

  • メソッドの引数は原則 null 禁止にする
  • どうしても null が来る可能性があるところだけ、Optional や if 文で受け止める

こうやって「null が入り込む境界」をはっきりさせると、コード全体が安定します。
Objects.requireNonNull は、その境界を守るための強い味方です。

2. 「null を早く潰す」

null のまま奥まで流すと、原因が分かりにくい NPE になります。
できるだけ「入口付近」で null をチェックして、意味のあるメッセージ付きで例外を投げるか、
デフォルト値に変換してしまうほうが、デバッグも保守も楽になります。

3. 「読みやすさ」を最優先する

  • if 文がネストしすぎて読みにくくなっていないか
  • Optional を使って逆に分かりにくくなっていないか
  • チームメンバーが見てすぐ理解できるか

業務コードは「チームで長く保守する」ものなので、
かっこよさより「分かりやすさ」を優先したほうが、結果的に品質が上がります。


まとめ:初心者がまず身につけるべきステップ

ステップ 1:if 文での基本的な null チェックに慣れる

  • if (obj == null) / if (obj != null) を自然に書けるようにする
  • obj.equals(...) ではなく "定数".equals(obj) の書き方に慣れる

ステップ 2:Objects クラスを使ってみる

  • Objects.isNull / Objects.nonNull を知る
  • Objects.requireNonNull で「必須パラメータ」を守る感覚をつかむ

ステップ 3:Optional で「値がない」という状態を設計に組み込む

  • 戻り値に Optional<T> を使って、「ないかもしれない」を型で表現する
  • orElseifPresent を使って、スマートに null を扱う

ここまで身につけば、業務・実務で通用する「null と付き合う力」はかなり高いレベルに到達します。

タイトルとURLをコピーしました