JavaのNullPointerException(NPE)の原因と対策:エラーを防ぐ安全な書き方

最終更新日: 2026-08-27

💡 このエラーを含む【Javaエラー完全攻略ハンドブック】をnoteで公開中 →

30秒でわかる原因と解決策

原因: 値が格納されていない(nullである)オブジェクトの変数に対して、メソッドの呼び出しやプロパティへのアクセスを行ったため。 解決策: 変数が null でないことを事前に確認する(nullチェック)、Java 8以降の Optional を活用する、またはApache Commons等のユーティリティメソッドを使用する。


修正コード(Before / After)

❌ エラーが発生するコード

以下のコードでは、getName()null を返した場合、その返り値に対して length() を呼び出そうとして NullPointerException が発生します。

public class Main {
    public static void main(String[] args) {
        User user = new User(null);
        
        // user.getName() が null のため、ここで NullPointerException が発生する
        int length = user.getName().length();
        System.out.println("名前の長さ: " + length);
    }
}

class User {
    private String name;
    public User(String name) { this.name = name; }
    public String getName() { return name; }
}

⭕ 修正後の推奨コード

null チェックを行うか、Javaの Optional クラスを使用して安全に値を取り扱います。

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        User user = new User(null);
        
        // 対策1: 明示的な null チェック
        String name = user.getName();
        if (name != null) {
            System.out.println("名前の長さ: " + name.length());
        } else {
            System.out.println("名前は登録されていません。");
        }

        // 対策2: Optional を活用した安全な記述
        int length = Optional.ofNullable(user.getName())
                             .map(String::length)
                             .orElse(0);
        System.out.println("名前の長さ(Optional使用): " + length);
    }
}

class User {
    private String name;
    public User(String name) { this.name = name; }
    public String getName() { return name; }
}

よくある発生パターンと解説

Javaの NullPointerException(通称:NPE)は、開発者が最も頻繁に遭遇する実行時例外の一つです。主な発生パターンは以下の通りです。

  1. 初期化されていないオブジェクトの操作
    • インスタンスを new せずに変数を宣言しただけでメソッドを呼び出した場合。
  2. データベースのクエリ結果や外部APIのレスポンスが空(null)
    • 該当するレコードが見つからずに null が返却されたオブジェクトをそのまま処理した場合。
  3. コレクション(ListやMapなど)の要素やキーの扱い
    • マップから存在しないキーで値を取り出したり、null を含むリストをループ処理した場合。

エラーを防ぐためのベストプラクティス


よくある質問 (FAQ)

Q1. NullPointerException が発生した際、どこを確認すればいいですか? A1. スタックトレース(エラーログ)を確認してください。エラーが発生したファイルの「行番号」が明確に示されているため、該当行にあるどのオブジェクトやメソッドが null になっているかを特定します。

Q2. Java 14以降でのエラーメッセージの改善について教えてください。 A2. Java 14から導入された「Helpful NullPointerExceptions」機能により、どの式の評価結果が null であったのかが詳細にメッセージとして表示されるようになりました。これにより、原因箇所の特定が従来よりも容易になっています。

💡 このエラーを含む【Javaエラー完全攻略ハンドブック】をnoteで公開中 →