JavaのNullPointerExceptionとその対処方法
Javaでプログラムを書いていると、時折「NullPointerException」というエラーに遭遇することがあります。
このエラーは、null値を持つオブジェクト参照に対して操作を試みたときに発生します。つまり、存在しないオブジェクトにアクセスしようとした場合にJavaランタイムから投げられる例外です。
では、いくつかの具体的なシナリオとその対処方法を見てみましょう。
Javaのエラー一覧はコチラ
-
【Java】よく発生するエラー一覧12選 エラーの発生事例と対処方法をみてみよう!
Javaのエラーとその対処方法 この記事では、Javaでよく発生するエラーと各エラーが起きる事例と、その対処方法を紹介していきます。 下記のエラーについてみていきます! エラーリスト NullPoin ...
続きを見る
シナリオ1: オブジェクトが初期化されていない
最も一般的なNullPointerExceptionの発生原因は、オブジェクトがまだ初期化されていない場合です。これは、オブジェクト参照がnullのまま操作を試みると発生します。
エラーが発生するソースコード
1 2 3 4 5 6 |
public class Main { public static void main(String[] args) { String str = null; System.out.println(str.length()); } } |
このコードはNullPointerExceptionを発生させます。なぜなら、変数strはnullで初期化されているにもかかわらず、その後でstr.length()というメソッドを呼び出そうとしているからです。
出力結果
Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:4)
その通りです。対処方法としては、nullチェックを行うか、適切にオブジェクトを初期化することが考えられます。
対処後のソースコード
1 2 3 4 5 6 |
public class Main { public static void main(String[] args) { String str = "Hello, World!"; System.out.println(str.length()); } } |
この修正後のコードでは、最初から変数strを文字列"Hello, World!"で初期化しています。そのため、str.length()はエラーを発生させずに正常に動作します。
出力結果
13
KindleUnlimited会員であれば、全ての本をご覧頂けます。 StreamAPIを理解すれば、Javaの世界が変わる 第1版
シナリオ2: 配列やコレクションが初期化されていない
配列やコレクションを使用する際にもNullPointerExceptionが発生することがあります。これは、配列やコレクションを適切に初期化せずに利用しようとしたときに発生します。
エラーが発生するソースコード
1 2 3 4 5 6 |
public class Main { public static void main(String[] args) { String[] strArray = null; System.out.println(strArray.length); } } |
このコードでは、変数strArrayがnullで初期化されています。そのため、strArray.lengthを呼び出すとNullPointerExceptionが発生します。
出力結果
Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:4)
その通りです。対処方法としては、配列を適切に初期化することが必要です。
対処後のソースコード
1 2 3 4 5 6 |
public class Main { public static void main(String[] args) { String[] strArray = {"Hello", "World"}; System.out.println(strArray.length); } } |
この修正後のコードでは、最初から配列strArrayを{"Hello", "World"}で初期化しています。そのため、strArray.lengthはエラーを発生させずに正常に動作します。
出力結果
2
シナリオ3: オブジェクトのフィールドが初期化されていない
オブジェクト指向プログラミングでは、クラスのフィールドを利用することがよくあります。しかし、これらのフィールドが適切に初期化されていない場合、NullPointerExceptionが発生する可能性があります。
エラーが発生するソースコード
1 2 3 4 5 6 7 8 9 10 |
public class Main { static class MyClass { String myField; } public static void main(String[] args) { MyClass myObject = new MyClass(); System.out.println(myObject.myField.length()); } } |
このコードでは、MyClassのインスタンスを生成し、そのフィールドmyFieldの長さを出力しようとしています。しかし、myFieldは初期化されていないためNullPointerExceptionが発生します。
出力結果
Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:8)
その通りです。対処方法としては、フィールドを適切に初期化することが必要です。
対処後のソースコード
1 2 3 4 5 6 7 8 9 10 |
public class Main { static class MyClass { String myField = "Hello, World!"; } public static void main(String[] args) { MyClass myObject = new MyClass(); System.out.println(myObject.myField.length()); } } |
この修正後のコードでは、MyClassのフィールドmyFieldを初期化しています。そのため、myObject.myField.length()はエラーを発生させずに正常に動作します。
出力結果
13
シナリオ4: メソッドがnullを返す
メソッドがnullを返す場合、その返り値に対して何か操作を行おうとするとNullPointerExceptionが発生します。これは、メソッドの返り値が予期せぬnullになる場合に特に注意が必要です。
エラーが発生するソースコード
1 2 3 4 5 6 7 8 9 10 |
public class Main { public static String getNull() { return null; } public static void main(String[] args) { String str = getNull(); System.out.println(str.length()); } } |
このコードでは、getNullメソッドがnullを返します。そのため、str.length()を呼び出すとNullPointerExceptionが発生します。
出力結果
Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:8)
その通りです。対処方法としては、メソッドがnullを返さないようにするか、nullを返す可能性がある場合はその後の処理でnullチェックを行うことが必要です。
対処後のソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Main { public static String getNull() { return "Hello, World!"; } public static void main(String[] args) { String str = getNull(); if (str != null) { System.out.println(str.length()); } else { System.out.println("str is null"); } } } |
この修正後のコードでは、getNullメソッドがnullを返す代わりに文字列を返し、その後の処理でnullチェックを行っています。そのため、str.length()はエラーを発生させずに正常に動作します。
出力結果
13
シナリオ5: 未初期化の配列要素にアクセスする
Javaでは、配列を初期化するとそのすべての要素はデフォルト値(数値型であれば0、ブール型であればfalse、オブジェクト参照であればnull)に設定されます。しかし、配列要素がオブジェクト参照の場合、その要素に対して何か操作を行おうとするとNullPointerExceptionが発生します。
エラーが発生するソースコード
1 2 3 4 5 6 |
public class Main { public static void main(String[] args) { String[] array = new String[5]; System.out.println(array[0].length()); } } |
このコードでは、array[0].length()を呼び出していますが、array[0]は初期化されていません(つまりnull)。そのため、NullPointerExceptionが発生します。
出力結果
Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:4)
その通りです。配列の各要素を使用する前に、nullでないことを確認することが重要です。
対処後のソースコード
1 2 3 4 5 6 7 |
public class Main { public static void main(String[] args) { String[] array = new String[5]; array[0] = "Hello, World!"; System.out.println(array[0].length()); } } |
この修正後のコードでは、array[0]に文字列を代入してからarray[0].length()を呼び出しています。そのため、NullPointerExceptionは発生せず、コードは正常に動作します。
出力結果
13
まとめ
JavaのNullPointerExceptionは、nullオブジェクト参照に対して操作を行おうとしたときに発生します。これは、変数が初期化されていない場合、未定義のオブジェクトフィールドにアクセスしようとした場合、nullを返すメソッドを呼び出した場合、初期化されていない配列要素にアクセスしようとした場合など、さまざまな状況で発生します。
これらのシナリオを理解し、nullチェックを適切に行うことで、NullPointerExceptionを防ぐことができます。
この記事を通じてNullPointerExceptionの基本的な理解と、それを防ぐためのいくつかの方法を学ぶことができたと思います。しかし、これは決して網羅的なリストではありません。Javaのコーディング時には、常にNullPointerExceptionが発生する可能性を念頭に置き、適切にnullチェックを行うことが重要です。
最後まで読んで頂き、ありがとうございました。少しでもお役にたてたなら幸いです!
Javaのエラー一覧はコチラ
-
【Java】よく発生するエラー一覧12選 エラーの発生事例と対処方法をみてみよう!
Javaのエラーとその対処方法 この記事では、Javaでよく発生するエラーと各エラーが起きる事例と、その対処方法を紹介していきます。 下記のエラーについてみていきます! エラーリスト NullPoin ...
続きを見る