JavaのNullPointerExceptionとは?原因・対処法・予防策を徹底解説!

Java

はじめに

Javaで開発をしていると、誰もが一度は遭遇するエラーがあります。

Exception in thread "main" java.lang.NullPointerException

これは「NullPointerException(ヌルポ)」と呼ばれるエラーで、Java初心者にとっての“登竜門”とも言える存在です。

この記事では、NullPointerExceptionの正体・原因・対処法・予防策までを徹底解説します。これを読めば、もうヌルポに悩まされることはありません!


1. NullPointerExceptionとは?

NullPointerException は、**nullのオブジェクトに対してメソッドを呼び出したり、フィールドにアクセスしようとしたときに発生する例外(エラー)**です。

Javaの変数は、何も代入しなければ null という「何もない」状態になります。そこにアクセスしようとすると「何もないのにアクセスできるわけないだろ!」とJavaが怒るのです。


2. どんなときに起きるの?

❌ メソッドを呼び出すとき

String name = null;
System.out.println(name.length()); // NullPointerException

❌ フィールドにアクセスしたとき

User user = null;
System.out.println(user.id); // NullPointerException

❌ 配列やリストがnullのまま使われたとき

String[] names = null;
System.out.println(names[0]); // NullPointerException

3. エラーメッセージの読み方

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "name" is null
at Main.main(Main.java:5)
  • Main.java:5 → 5行目でエラーが発生した
  • because “name” is nullnamenull だった

Java 14以降では、どの変数がnullだったかも表示してくれるので、原因特定がしやすくなりました!


4. NullPointerExceptionが起きる5大原因とその対処法

原因①:変数が初期化されていない

String name; // nullのまま
System.out.println(name.length()); // NullPointerException

✅ 対処法:初期化する!

String name = "Java";
System.out.println(name.length()); // OK

原因②:メソッドの戻り値がnull

String value = getValue(); // getValue()がnullを返す
System.out.println(value.length()); // NullPointerException

✅ 対処法:戻り値がnullかチェック

if (value != null) {
System.out.println(value.length());
}

原因③:配列やリストがnull

List<String> names = null;
System.out.println(names.size()); // NullPointerException

✅ 対処法:newで初期化しておく

List<String> names = new ArrayList<>();

原因④:クラス内部での参照ミス

public class User {
Address address;
}

User user = new User();
System.out.println(user.address.city); // NullPointerException

✅ 対処法:内部のフィールドも初期化する

user.address = new Address();
System.out.println(user.address.city);

原因⑤:引数がnullだった

printLength(null);

void printLength(String str) {
System.out.println(str.length()); // NullPointerException
}

✅ 対処法:引数にnullが来ないようチェックする

if (str != null) {
System.out.println(str.length());
}

5. 効果的な予防法

✅ nullチェックを習慣にする

if (user != null && user.name != null) {
System.out.println(user.name.length());
}

✅ Objects.requireNonNull() を使う

import java.util.Objects;

public void setName(String name) {
this.name = Objects.requireNonNull(name, "名前はnullにできません");
}

✅ Optionalでnullを包む(Java 8以降)

Optional<String> maybe = Optional.ofNullable(name);
maybe.ifPresent(n -> System.out.println(n.length()));

6. nullをcatchするのはNG!?

よくある誤解:

try {
System.out.println(name.length());
} catch (NullPointerException e) {
System.out.println("nullでした");
}

✅ これは例外の使い方としてよくないです!

NullPointerExceptionは「発生しないように予防する」のが正しい対応です。


7. よくあるパターン別:実践コード集

名前がnullのときに「未入力」と表示

if (name == null || name.isEmpty()) {
System.out.println("名前が入力されていません");
} else {
System.out.println("こんにちは " + name + " さん");
}

nullを含むリストの処理

for (String item : list) {
if (item != null) {
System.out.println(item.toUpperCase());
}
}

8. 学習の進め方

NullPointerException は最初は難しいですが、nullという概念と上手に付き合うことがJavaの第一歩です!

まずは「絶対にJavaプログラマーになりたい人へ。」で基礎を固めて、nullと例外処理の理解を深めましょう。

さらに実践的な指導を受けたい方は、「サイゼントアカデミー」の学習サポートをぜひ活用してください!


まとめ

  • NullPointerException は「nullなのに何かしようとした」エラー
  • 原因は「初期化忘れ」「戻り値がnull」「引数がnull」など
  • 予防策はnullチェック・Optional・requireNonNull
  • 例外処理に頼らず、nullが来ないコードを書くことが大事

コメント

タイトルとURLをコピーしました