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()); // ヌルポが発生するかも?
このコードの問題点:
id = 1
のユーザーが存在しない場合、rs.getString("name")
はnull
を返す可能性がある。null.length()
を実行すると、NullPointerExceptionが発生する。
以下のようなケースを考えてみましょう。
カラムの値が NULL
のケース
例えば、データベースに以下のようなテーブルがあるとします。
id | name |
---|---|
1 | NULL |
name
カラムにNOT NULL制約が付いていないため、値がNULL
で登録されてしまっています。
Javaのコード例(問題あり)
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");
if (rs.next()) {
String name = rs.getString("name"); // NULLが返る可能性あり
System.out.println(name.length()); // ←ここでNullPointerExceptionが発生する!
}
問題点の解説
rs.next()
はレコード自体の存在をチェックします。この場合、id=1のレコード自体は存在しているため、rs.next()
はtrue
を返します。- しかし、カラムの値が
NULL
の場合、rs.getString("name")
は Javaではnull
を返します。 - この状態で
name.length()
を実行すると、null.length()
を呼び出したことになり、NullPointerException
が発生します。
対策方法
以下のようにnullチェックまたはOptionalで安全に処理します。
① 基本的なnullチェック
if (rs.next()) {
String name = rs.getString("name");
if (name != null) {
System.out.println(name.length());
} else {
System.out.println("名前が設定されていません。");
}
}
② Optionalを使った処理(Java 8以降推奨)
if (rs.next()) {
Optional<String> optionalName = Optional.ofNullable(rs.getString("name"));
optionalName.ifPresentOrElse(
name -> System.out.println(name.length()),
() -> System.out.println("名前が設定されていません。")
);
}
対策
next()
のチェックを行うnull
チェックを行う- 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. まとめ:ヌルポを回避するために
- データベースの取得結果がnullの可能性を考慮する
rs.next()
をチェックnull
チェックを忘れずにOptional
を活用
- フォーム入力がnullの可能性を考慮する
request.getParameter()
の値がnull
でないかチェックOptional.ofNullable()
を使うとスッキリ書ける
- 事前にnullを防ぐ工夫をする
@NonNull
を使う(Spring Boot, Lombok)Objects.requireNonNull()
でチェックorElse()
でデフォルト値を設定
新人エンジニアは特に、「nullの可能性」を常に意識することが大切です!
「この値はnullになる可能性があるか?」と考えながら実装すると、バグを未然に防げるようになります。
実際の開発現場でも役立つ知識なので、ぜひ実践してみてください!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール

- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年3月21日現代貨幣理論(MMT)と自国通貨建て国債論をエンジニア向けにわかりやすく解説
山崎講師2025年3月21日【新人エンジニア必見!】マクロ経済スライドと年金の基本を解説
山崎講師2025年3月21日MM理論とは?企業の資本構成を考える基本理論を解説!
山崎講師2025年3月21日インフレ・デフレ・リフレとは?新人エンジニア向けにわかりやすく解説!