【初心者向けエラーシリーズ#4】「NullPointerException」って何?Java初心者がつまずく“null”のエラーをやさしく解説!

この記事は約6分で読めます。
記事内に広告が含まれています。

はじめに:実行時に突然出る「NullPointerException」

コードはコンパイルも通ったし、エラーもない。よし!と思って実行ボタンを押したそのとき、突然こんなエラーが表示されることがあります。

Exception in thread "main" java.lang.NullPointerException

画面に表示された英語の群れに、初心者の方は「なにこれ…?」と戸惑うかもしれません。
これは、Javaの中でも特に発生頻度が高く、理解に時間がかかるエラーのひとつです。

「null(ヌル)」という言葉を正確に理解していないと、何度も同じミスを繰り返してしまいがちです。ですが、逆に言えば「nullとは何か」「どんなときにnullになるか」「nullをどう扱うか」が分かれば、回避できるエラーでもあります。

この記事では、「NullPointerException」とは何なのか、なぜ起こるのか、どう防げばいいのかを、初心者向けにやさしく解説します。

NullPointerExceptionとは?

Javaでは、すべてのオブジェクト型の変数は「参照(ポインタ)」として扱われています。
その参照元が「何も指していない(null)」状態であるにもかかわらず、その変数を使おうとすると起きるのがこのエラーです。

つまり、

「null(中身がない)なのに使おうとしたよ」

というエラーになります。

このエラーはコンパイル時には検出されないため、「プログラムが動いてから」初めて発生します。だからこそ、実行するまで気づけない点が初心者にとって厄介なのです。

よくある原因と対処法

原因1:初期化せずに使っている

Javaでは、オブジェクト型の変数を宣言しただけでは「null」の状態になっています。中身を代入していない状態の変数に対してメソッドを呼び出すと、NullPointerExceptionが発生します。

間違った例:

public class Main {
    public static void main(String[] args) {
        String name;
        System.out.println(name.length());
    }
}

修正方法:

public class Main {
    public static void main(String[] args) {
        String name = "Taro";
        System.out.println(name.length());
    }
}

※変数を宣言しただけでは使えない。必ず初期化するようにしましょう。

原因2:メソッドの戻り値がnullだった

あるメソッドがnullを返す可能性がある場合、それをそのまま使ってしまうと危険です。

間違った例:

public class Main {
    public static void main(String[] args) {
        String message = getMessage();
        System.out.println(message.length());
    }

    public static String getMessage() {
        return null;
    }
}

修正方法:

public static String getMessage() {
    return "こんにちは";
}

nullチェックを入れると、エラーを防げます。

if (message != null) {
    System.out.println(message.length());
} else {
    System.out.println("メッセージがありません");
}

実務でも「nullチェック」は必須スキルです。

原因3:配列やリストの中身がnull

Javaでは、配列を作った段階では各要素はnullになっています。特に参照型(StringやObjectなど)の配列では中身が自動的にnullに初期化されるため注意が必要です。

間違った例:

String[] items = new String[3];
items[0] = null;
System.out.println(items[0].length());

修正方法:

items[0] = "apple";
System.out.println(items[0].length());

リスト(ArrayListなど)を使う場合も同様です。add()やset()で値を入れる前にアクセスしないようにしましょう。

エラーを防ぐためのポイント

  • オブジェクト型の変数は使う前に必ず初期化する
  • メソッドの戻り値がnullの可能性がある場合は、nullチェックを入れる
  • 配列やリストを使うときも、中身がnullかどうか確認する
  • nullチェックはif (x != null)で行う習慣をつける
  • IDE(例:IntelliJ IDEAやEclipse)の「null警告」や「コード補完」機能を活用する
  • Optionalクラス(Java8以降)を使って、安全にnullを扱う方法もある(中級者以上向け)

復習クイズ:このコードはどこが問題?

public class Main {
    public static void main(String[] args) {
        String[] data = new String[2];
        data[1] = null;
        System.out.println(data[1].toUpperCase());
    }
}

上のコードを実行するとNullPointerExceptionが発生します。なぜなら、data[1]がnullだからです。

まとめ:nullを扱うときは「使う前の確認」がカギ!

  • NullPointerExceptionは「中身がnullなのに使ったとき」に発生
  • 原因の多くは「初期化忘れ」や「戻り値がnull」
  • nullの可能性がある変数は、必ずチェックを入れる
  • nullチェックの習慣をつけることで、多くの実行時エラーを防ぐことができる

このエラーは、慣れるまでは厳しいですが、考え方を知れば対処は難しくありません。
「nullかもしれない」と思ったら、安全に使うためのコードを書く習慣を身につけましょう。

次回は、「配列の範囲外です」(ArrayIndexOutOfBoundsException)というエラーについて解説予定です!

配列やリストを扱うときに必ず知っておきたいエラーなので、次回もぜひご覧ください!

コメント

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