Javaの新人エンジニア向け:データベースやフォーム入力時に発生するNullPointerExceptionの解説

こんにちは。ゆうせいです。
Javaの開発現場では、**NullPointerException(通称ヌルポ)**に頻繁に遭遇します。特に、新人エンジニアがデータベースやフォームからデータを取得する際に陥りやすいポイントです。
今回は、なぜヌルポが発生するのか、その回避方法、そして実践的な対策について詳しく解説していきます!


1. NullPointerExceptionとは?

Javaでは、オブジェクトがnullの状態でメソッドを呼び出したり、プロパティへアクセスしようとすると発生するランタイムエラーです。
簡単に言うと、「何もないもの(null)に対して操作しようとしたからエラーになった」ということです。

例:ヌルポの発生例

String str = null;
System.out.println(str.length()); // NullPointerException 発生!

上記のコードでは、strに**何もセットされていない(null)**ため、length()メソッドを呼ぼうとするとエラーになります。


2. データベース操作時に発生するNullPointerException

発生するケース

Javaでデータベース(DB)を扱う際、SQLの結果がnullの可能性を考慮していないと、ヌルポが発生します。

例:JDBCを使ったデータ取得

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "user", "password");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT name FROM users WHERE id = 1");

String name = rs.getString("name"); // ここでヌルポの可能性!
System.out.println(name.length()); // ヌルポが発生するかも?

このコードの問題点:

  1. id = 1 のユーザーが存在しない場合、rs.getString("name")null を返す可能性がある。
  2. null.length() を実行すると、NullPointerExceptionが発生する。

対策

  1. next() のチェックを行う
  2. null チェックを行う
  3. Optionalを活用する(Java 8以降推奨)

修正コード

if (rs.next()) { // データがあるか確認
    String name = rs.getString("name");
    if (name != null) {
        System.out.println(name.length());
    } else {
        System.out.println("名前がnullです");
    }
} else {
    System.out.println("該当データなし");
}

これで、データが存在しない場合や、nullの可能性を考慮した処理ができます。


3. フォームからのデータ取得時に発生するNullPointerException

Webアプリ開発では、ユーザーの入力データがnullである可能性を考慮しないと、ヌルポが発生します。

例:Servletでのフォームデータ取得

String name = request.getParameter("name");
System.out.println(name.length()); // nameがnullの場合、ヌルポ!

このコードの問題点:

  • request.getParameter("name") は、フォームで name が送信されなかった場合、null を返す。
  • name.length() を呼ぶと、NullPointerExceptionが発生する。

対策

  • null チェックを行う
  • Optional を活用する(Java 8以降)

修正コード

String name = request.getParameter("name");
if (name != null) {
    System.out.println(name.length());
} else {
    System.out.println("名前が入力されていません");
}

Optionalを使った場合(Java 8以降):

Optional.ofNullable(request.getParameter("name"))
        .ifPresentOrElse(n -> System.out.println(n.length()), 
                         () -> System.out.println("名前が入力されていません"));


4. NullPointerExceptionの発生を未然に防ぐ方法

① @NonNullアノテーションの活用

Spring BootやLombokを使う場合、@NonNull を使うとコンパイル時に警告が出せる。

public void printLength(@NonNull String name) {
    System.out.println(name.length());
}

引数がnullの場合、実行前にエラーとして検出されるため、安全性が高まる。

② Objects.requireNonNullを使う

String name = Objects.requireNonNull(request.getParameter("name"), "名前は必須です");
System.out.println(name.length());

nullなら即座に例外を投げるため、バグを未然に防げる。

③ デフォルト値を設定する

String name = Optional.ofNullable(request.getParameter("name")).orElse("名無し");
System.out.println(name.length());

nullなら"名無し"をデフォルトで設定できる。


5. まとめ:ヌルポを回避するために

  1. データベースの取得結果がnullの可能性を考慮する
    • rs.next() をチェック
    • null チェックを忘れずに
    • Optional を活用
  2. フォーム入力がnullの可能性を考慮する
    • request.getParameter() の値が null でないかチェック
    • Optional.ofNullable() を使うとスッキリ書ける
  3. 事前にnullを防ぐ工夫をする
    • @NonNull を使う(Spring Boot, Lombok)
    • Objects.requireNonNull() でチェック
    • orElse() でデフォルト値を設定

新人エンジニアは特に、「nullの可能性」を常に意識することが大切です!
「この値はnullになる可能性があるか?」と考えながら実装すると、バグを未然に防げるようになります。
実際の開発現場でも役立つ知識なので、ぜひ実践してみてください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。