はじめに:実行時に突然出る「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)というエラーについて解説予定です!
配列やリストを扱うときに必ず知っておきたいエラーなので、次回もぜひご覧ください!
コメント