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)Javanullならtrueを返します。
Objects.nonNull()
Objects.nonNull(user)Javanullでなければtrueを返します。
Objects.requireNonNull()
Objects.requireNonNull(user)Javanullなら例外を発生させます。
判定だけではなく、 「強制的に保証する」 のが最大の違いです。
実務で使えるテンプレート集
コンストラクタ引数検証
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アプリケーションを構築するための重要な設計ツールとして活用されています。
