はじめに
Javaで開発をしていると、誰もが一度は遭遇するエラーがあります。
1 |
Exception in thread "main" java.lang.NullPointerException<br> |
これは「NullPointerException(ヌルポ)」と呼ばれるエラーで、Java初心者にとっての“登竜門”とも言える存在です。
この記事では、NullPointerExceptionの正体・原因・対処法・予防策までを徹底解説します。これを読めば、もうヌルポに悩まされることはありません!
1. NullPointerExceptionとは?
NullPointerException
は、**nullのオブジェクトに対してメソッドを呼び出したり、フィールドにアクセスしようとしたときに発生する例外(エラー)**です。
Javaの変数は、何も代入しなければ null
という「何もない」状態になります。そこにアクセスしようとすると「何もないのにアクセスできるわけないだろ!」とJavaが怒るのです。
2. どんなときに起きるの?
❌ メソッドを呼び出すとき
1 |
String name = null;<br>System.out.println(name.length()); // NullPointerException<br> |
❌ フィールドにアクセスしたとき
1 |
User user = null;<br>System.out.println(user.id); // NullPointerException<br> |
❌ 配列やリストがnullのまま使われたとき
1 |
String[] names = null;<br>System.out.println(names[0]); // NullPointerException<br> |
3. エラーメッセージの読み方
1 |
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "name" is null<br> at Main.main(Main.java:5)<br> |
- Main.java:5 → 5行目でエラーが発生した
- because “name” is null →
name
がnull
だった
Java 14以降では、どの変数がnullだったかも表示してくれるので、原因特定がしやすくなりました!
4. NullPointerExceptionが起きる5大原因とその対処法
原因①:変数が初期化されていない
1 |
String name; // nullのまま<br>System.out.println(name.length()); // NullPointerException<br> |
✅ 対処法:初期化する!
1 |
String name = "Java";<br>System.out.println(name.length()); // OK<br> |
原因②:メソッドの戻り値がnull
1 |
String value = getValue(); // getValue()がnullを返す<br>System.out.println(value.length()); // NullPointerException<br> |
✅ 対処法:戻り値がnullかチェック
1 |
if (value != null) {<br> System.out.println(value.length());<br>}<br> |
原因③:配列やリストがnull
1 |
List<String> names = null;<br>System.out.println(names.size()); // NullPointerException<br> |
✅ 対処法:newで初期化しておく
1 |
List<String> names = new ArrayList<>();<br> |
原因④:クラス内部での参照ミス
1 |
public class User {<br> Address address;<br>}<br><br>User user = new User();<br>System.out.println(user.address.city); // NullPointerException<br> |
✅ 対処法:内部のフィールドも初期化する
1 |
user.address = new Address();<br>System.out.println(user.address.city);<br> |
原因⑤:引数がnullだった
1 |
printLength(null);<br><br>void printLength(String str) {<br> System.out.println(str.length()); // NullPointerException<br>}<br> |
✅ 対処法:引数にnullが来ないようチェックする
1 |
if (str != null) {<br> System.out.println(str.length());<br>}<br> |
5. 効果的な予防法
✅ nullチェックを習慣にする
1 |
if (user != null && user.name != null) {<br> System.out.println(user.name.length());<br>}<br> |
✅ Objects.requireNonNull() を使う
1 |
import java.util.Objects;<br><br>public void setName(String name) {<br> this.name = Objects.requireNonNull(name, "名前はnullにできません");<br>}<br> |
✅ Optionalでnullを包む(Java 8以降)
1 |
Optional<String> maybe = Optional.ofNullable(name);<br>maybe.ifPresent(n -> System.out.println(n.length()));<br> |
6. nullをcatchするのはNG!?
よくある誤解:
1 |
try {<br> System.out.println(name.length());<br>} catch (NullPointerException e) {<br> System.out.println("nullでした");<br>}<br> |
✅ これは例外の使い方としてよくないです!
NullPointerExceptionは「発生しないように予防する」のが正しい対応です。
7. よくあるパターン別:実践コード集
名前がnullのときに「未入力」と表示
1 |
if (name == null || name.isEmpty()) {<br> System.out.println("名前が入力されていません");<br>} else {<br> System.out.println("こんにちは " + name + " さん");<br>}<br> |
nullを含むリストの処理
1 |
for (String item : list) {<br> if (item != null) {<br> System.out.println(item.toUpperCase());<br> }<br>}<br> |
8. 学習の進め方
NullPointerException
は最初は難しいですが、nullという概念と上手に付き合うことがJavaの第一歩です!
まずは「絶対にJavaプログラマーになりたい人へ。」で基礎を固めて、nullと例外処理の理解を深めましょう。
さらに実践的な指導を受けたい方は、「サイゼントアカデミー」の学習サポートをぜひ活用してください!
まとめ
NullPointerException
は「nullなのに何かしようとした」エラー- 原因は「初期化忘れ」「戻り値がnull」「引数がnull」など
- 予防策はnullチェック・Optional・requireNonNull
- 例外処理に頼らず、nullが来ないコードを書くことが大事
コメント