Java Tips | 基本ユーティリティ:Objects.requireNonNull()

Web APP Java
スポンサーリンク
スポンサーリンク

Objects.requireNonNull()とは何か

Javaで業務システムを開発していると、「この値は絶対にnullであってはいけない」という場面が頻繁に登場します。

例えば、顧客情報、注文情報、社員情報、設定情報など、システムの処理に必須となるデータです。

そのような場合に利用する便利なユーティリティメソッドが Objects.requireNonNull() です。

このメソッドは、 「対象オブジェクトがnullでないことを保証する」 ために使用します。

もしnullだった場合は、その場で例外を発生させて処理を停止します。

Objects.requireNonNull(対象オブジェクト);
Java

戻り値の動作は以下の通りです。

  • nullではない → オブジェクトをそのまま返す
  • null → NullPointerExceptionを発生させる

一見すると厳しい処理に見えるかもしれませんが、実務開発では障害の早期発見に非常に役立つ重要なメソッドです。

まずはnull問題を理解しよう

Javaで初心者が最も遭遇しやすい例外の一つがNullPointerExceptionです。

例えば次のコードを見てください。

String name = null;

// nameがnullなのにlength()を実行
System.out.println(name.length());
Java

実行結果

NullPointerException

エラー自体は発生していますが、問題はエラー発生箇所が本当の原因から遠く離れている場合があることです。

実務システムでは値が複数のメソッドを経由して渡されるため、「どこでnullになったのか」が分からなくなるケースがあります。

そこで登場するのが Objects.requireNonNull() です。

Objects.requireNonNull()の基本構文

最も基本的な使い方から見ていきましょう。

import java.util.Objects;

String name = "MONO";

// nullでないことを保証
Objects.requireNonNull(name);

System.out.println(name);
Java

実行結果

MONO

nameはnullではないため正常に処理されます。

ステップバイステップで理解する

ステップ1:値を準備する

// ユーザー名を準備
String userName = "Tanaka";
Java

ステップ2:requireNonNull()を実行する

// nullでないことを検証
Objects.requireNonNull(userName);
Java

ステップ3:後続処理を実行する

// 安全に利用できる
System.out.println(userName.length());
Java

このように、 「ここから先はnullではない」 ということを明示できます。

nullが渡された場合はどうなるのか

今度はnullを渡してみましょう。

String userName = null;

// nullなので例外発生
Objects.requireNonNull(userName);
Java

実行結果

NullPointerException

ここで重要なのは、 「問題が発見された瞬間に停止する」 という点です。

処理を無理に続行して障害が大きくなることを防げます。

なぜrequireNonNull()が重要なのか

初心者の方は、

if (obj == null) {
    throw new NullPointerException();
}
Java

と同じではないかと思うかもしれません。

確かに動作としては近いです。

しかしrequireNonNull()を使うことで、

  • コードが簡潔になる
  • 意図が明確になる
  • Java標準APIとして統一できる
  • 保守性が向上する

というメリットがあります。

戻り値を利用する便利な書き方

requireNonNull()はオブジェクトを返すため、代入と同時に利用できます。

// null検証しながら代入
String userName =
        Objects.requireNonNull(inputName);

// 以降は利用可能
System.out.println(userName);
Java

実務では非常によく見かける書き方です。

独自メッセージを設定する

実務ではこちらの利用頻度が高いです。

// 独自メッセージを指定
Objects.requireNonNull(
        user,
        "ユーザー情報が取得できません"
);
Java

実行結果

NullPointerException:
ユーザー情報が取得できません

障害調査の効率が大幅に向上します。

なぜメッセージ指定が重要なのか

大規模システムでは、

NullPointerException

だけでは原因が分からないことがあります。

しかし次のようなログであればどうでしょうか。

NullPointerException:
注文情報が存在しません

原因箇所をすぐに特定できます。

実務ではメッセージ付きの利用を強くおすすめします。

コンストラクタでの利用が頻出

requireNonNull()はコンストラクタで非常によく使用されます。

public class User {

    private final String name;

    public User(String name) {

        // nameがnullなら生成させない
        this.name = Objects.requireNonNull(
                name,
                "名前は必須です"
        );
    }
}
Java

このようにすることで、不正なオブジェクト生成を防ぐことができます。

オブジェクトの品質を保証できる

以下は危険な例です。

User user = new User(null);
Java

もしチェックがなければ、 「名前が存在しないUser」 が生成されてしまいます。

これは業務ロジックの不整合につながります。

メソッド引数の検証に使う

サービスクラスやユーティリティクラスでも頻繁に利用されます。

public void saveUser(User user) {

    // 必須引数チェック
    Objects.requireNonNull(
            user,
            "userは必須です"
    );

    // 保存処理
}
Java

メソッド入口で条件違反を検出できるため、問題の切り分けが容易になります。

Stream APIとの違い

初心者が勘違いしやすいポイントです。

requireNonNull()は、

  • nullを検出したら停止する

という用途です。

一方で、

Objects.nonNull()
Java

は、

  • nullかどうかを判定する
  • フィルタリングに利用する

用途が異なります。

Objects.isNull()・Objects.nonNull()との違い

Objects.isNull()

Objects.isNull(user)
Java

nullならtrueを返します。

Objects.nonNull()

Objects.nonNull(user)
Java

nullでなければtrueを返します。

Objects.requireNonNull()

Objects.requireNonNull(user)
Java

nullなら例外を発生させます。

判定だけではなく、 「強制的に保証する」 のが最大の違いです。

実務で使えるテンプレート集

コンストラクタ引数検証

public Product(String name) {

    // 商品名は必須
    this.name = Objects.requireNonNull(
            name,
            "商品名は必須です"
    );
}
Java

サービスメソッド検証

public void process(Order order) {

    // 注文情報必須
    Objects.requireNonNull(
            order,
            "注文情報がありません"
    );

    // 業務処理
}
Java

設定値検証

// 設定値の存在確認
String endpoint =
        Objects.requireNonNull(
                config.getEndpoint(),
                "API接続先が未設定です"
        );
Java

即時代入テンプレート

// nullを許可しない値
User user =
        Objects.requireNonNull(
                inputUser,
                "ユーザーが存在しません"
        );
Java

情報セキュリティの観点から見る重要性

nullチェック不足は単なるバグではありません。

業務システムでは以下の問題につながる可能性があります。

  • サービス停止
  • データ不整合
  • 例外連鎖による障害拡大
  • 可用性低下
  • 障害調査コスト増加

セキュアコーディングでは、 「異常値はできるだけ早く検出する」 という考え方が重要です。

Objects.requireNonNull()はまさにFail Fast(早期失敗)の代表的な実装手法です。

異常なデータを後続処理へ流さないことで、システム全体の安全性と信頼性を向上させることができます。

初心者が覚えておくべき重要ポイント

  • requireNonNull()はnull禁止を表現するメソッド
  • nullなら即座にNullPointerExceptionを発生させる
  • コンストラクタやメソッド入口での利用が特に多い
  • 障害の早期発見に役立つ
  • メッセージ付きの利用がおすすめ
  • nonNull()は判定、requireNonNull()は保証という違いがある

まとめ

Objects.requireNonNull()はJava標準ライブラリが提供するnull禁止ユーティリティです。

  • nullでないことを保証できる
  • nullなら即座に例外を発生させる
  • Fail Fastの考え方を実現できる
  • コンストラクタやメソッド引数検証で頻出する
  • 障害調査の効率化に役立つ
  • 保守性と安全性を向上させる
  • 業務システムで非常によく利用される

特に実務では、「あとでエラーになるかもしれない値」を放置するよりも、「問題が見つかった瞬間に停止する」方が保守しやすく安全です。そのため、Objects.requireNonNull()は単なるnullチェックではなく、堅牢なJavaアプリケーションを構築するための重要な設計ツールとして活用されています。

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