業務で必須になる「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("山田さんです");
}
Javaname が null の可能性があるのに、いきなり name.equals(...) を呼んでしまうと NPE になります。
安全に書くならこうです。
String name = null;
if ("山田".equals(name)) { // リテラル側から equals を呼ぶ
System.out.println("山田さんです");
}
Java"山田" は絶対に null にならないので、"山田".equals(name) なら name が null でも 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 ではありません");
}
JavaObjects.isNull(obj) は obj == null と同じ意味、Objects.nonNull(obj) は obj != null と同じ意味です。
ストリーム API などと組み合わせるときに、メソッド参照として使えるのが特に便利です。
list.stream()
.filter(Objects::nonNull) // null を除外
.forEach(System.out::println);
JavaObjects.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);
}
}
Javaname が null の場合、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);
}
JavaOptional.ofNullable(value) は、value が null なら「空の Optional」、null でなければ「中身ありの Optional」を返します。
Optional の基本的な使い方
Optional<String> nameOpt = findUserName(1L);
// 値があれば表示、なければ「不明」と表示
String label = nameOpt.orElse("不明");
System.out.println("ユーザー名: " + label);
JavaorElse は「中身があればそれを返し、なければデフォルト値を返す」メソッドです。
もう少し踏み込むと、こんな書き方もできます。
nameOpt.ifPresent(name -> {
System.out.println("こんにちは、" + name + "さん");
});
JavaifPresent は「値があるときだけ処理を実行する」メソッドです。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>を使って、「ないかもしれない」を型で表現する orElseやifPresentを使って、スマートに null を扱う
ここまで身につけば、業務・実務で通用する「null と付き合う力」はかなり高いレベルに到達します。

