JavaのNullPointerException(NPE)の原因と対策:エラーを防ぐ安全な書き方
最終更新日: 2026-08-27
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)は、開発者が最も頻繁に遭遇する実行時例外の一つです。主な発生パターンは以下の通りです。
- 初期化されていないオブジェクトの操作
- インスタンスを
newせずに変数を宣言しただけでメソッドを呼び出した場合。
- インスタンスを
- データベースのクエリ結果や外部APIのレスポンスが空(null)
- 該当するレコードが見つからずに
nullが返却されたオブジェクトをそのまま処理した場合。
- 該当するレコードが見つからずに
- コレクション(ListやMapなど)の要素やキーの扱い
- マップから存在しないキーで値を取り出したり、
nullを含むリストをループ処理した場合。
- マップから存在しないキーで値を取り出したり、
エラーを防ぐためのベストプラクティス
- メソッドの設計: 戻り値として
nullを返すことを極力避け、空のコレクションやOptional<T>を返すように設計する。 - アノテーションの活用:
@Nullableや@NonNullなどのアノテーションを利用し、IDE(IntelliJ IDEAやEclipseなど)の静的解析で事前に警告を検知する。
よくある質問 (FAQ)
Q1. NullPointerException が発生した際、どこを確認すればいいですか?
A1. スタックトレース(エラーログ)を確認してください。エラーが発生したファイルの「行番号」が明確に示されているため、該当行にあるどのオブジェクトやメソッドが null になっているかを特定します。
Q2. Java 14以降でのエラーメッセージの改善について教えてください。
A2. Java 14から導入された「Helpful NullPointerExceptions」機能により、どの式の評価結果が null であったのかが詳細にメッセージとして表示されるようになりました。これにより、原因箇所の特定が従来よりも容易になっています。