プログラム開発ではエラーと向き合う時間を減らすことが開発時間の短縮にも繋がります。
本記事では、Javaプログラムにおけるエラー解決の基本と、初心者が悩みがちな頻出エラーについてサンプルコードを掲載しながら対策をご紹介していきます。
目次
Javaで出力されるエラーの解決方法
Javaに限らずプログラミングでは、エラーとして出力された情報をしっかりと確認して対応することが問題解決には重要です。
Javaでエラー情報は基本的に英語で表示されるため、無意識に苦手意識を持っている方も少なくありません。
しかし順番にエラー内容を確認していくことで多くの問題を解決することが可能となります。
エラーの概要
まずは「Error」や「Exception」といったエラー内容の概要が表示されている場所を探してみましょう。
「NullPointerException」や「ClassCastException」といったエラーの分類をある程度把握することが出来ます。
エラーの概要により、どういったことが原因で処理が止まったのかを掴むことが可能です。
エラーの場所を特定
エラー情報にはスタックトレースとして、どこのクラスの何行目でエラーが発生したという情報が表示されます。
エラー概要が特定出来たらどの処理が発生原因となっているのかを突き止めておきましょう。
スタックトレースはこれまでの処理が実施されたクラス名や行番号が全て表示されるため、具体的にどの処理が発生原因となっているのか分かりにくいかも知れませんが、下から上に処理が順番に実行されているため、最後に実行された処理から確認すると特定しやすいと言えます。
エラーをそのまま検索
最後にエラーの解決方法ですが、まずはエラーをそのままGoogleなどで検索してみましょう。
大抵解決方法が既に掲載されているため、一般的なエラーであればそのまま適用することで解決することが出来ます。
検索した内容で解決しない場合には、より細かくエラー内容を解析する必要がありますが、まずはエラー内容をそのまま検索してみるのがエラー対応の基本であると言えます。
エラー1:NullPointerException
Javaの代表エラーとして挙げられ、開発者が最も遭遇する可能性が高いエラーが「NullPointerException」です。
参照値が何も設定されていない状態(null)のオブジェクトにアクセスしようとした際に発生するエラーです。
nullオブジェクトのフィールドやメソッドは使用することが出来ません。
サンプル
サンプルではnullのStringクラスにtrimメソッドを利用してみます。
package sample; public class Main { public static void main(String[] args) { String sample = null; System.out.println(sample.trim()); } }
実行結果が下記です。
Exception in thread "main" java.lang.NullPointerException at sample.Main.main(Main.java:7)
プログラム自体がシンプルなのでエラーも分かりやすくなっていますが、「NullPointerException」が発生し「Main.java」クラスの7行目が発生箇所であることを確認出来ます。
Stringクラスがnullの状態で、Stringクラスのtrimメソッドにアクセスしようとしたことによりエラーが発生しています。
対策
nullPointerExceptionの対策としては、オブジェクトのフィールドやメソッドにアクセスする前にnullでないかをif文で確認する方法が有効です。
NullPointerExceptionが発生してしまった場合には、エラー内容から遡り、どのオブジェクトがどの時点で意図せずnullとなっているのかをデバッグで確認していくことで、問題を解決することが可能となります。
エラー2:ClassCastException
オブジェクトを継承関係にないクラスにキャストしようとすると発生するエラーです。
ClassCastExceptionもJavaの定番エラーとして知られ、しっかりと対策する必要があります。
サンプル
package sample; public class Main { public static void main(String[] args) { Object sample1 = new String("123"); Integer sample2 = (Integer)sample1; System.out.println(sample2); } }
実行結果が下記です。
Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap') at sample.Main.main(Main.java:7)
サンプルでは一見数値として変換出来そうですが、「”123″」というString型の文字列を数値に変換しようしているため「ClassCastException」が発生してしまいます。
対策
ClassCastExceptionの対策としては、キャストしようといている型が適切かをしっかりと確認することが重要です。
他にも「instanceof」でキャストする型と一致しているかを確認するという方法でも対策可能です。
instanceofサンプル
package sample; public class Main { public static void main(String[] args) { Object sample1 = new String("123"); if(sample1 instanceof Integer) { Integer sample2 = (Integer)sample1; System.out.println(sample2); } else { System.out.println("型が一致しないため処理を実施しません。"); } } }
実行結果が下記です。
型が一致しないため処理を実施しません。
エラー3:ArrayIndexOutOfBoundsException
ArrayIndexOutOfBoundsExceptionは、配列のインデックスとして定義されていない要素にアクセスしようとした際に発生するエラーです。
配列のインデックスは「0」からスタートするのですが、「1」からスタートすると勘違いしてArrayIndexOutOfBoundsExceptionを起こしてしまうことは定番のミスです。
サンプル
package sample; public class Main { public static void main(String[] args) { String[] strArr = new String[3]; for(int i=0; i <= strArr.length; i++) { strArr[i] = "テスト" + i; System.out.println(strArr[i]); } } }
実行結果が下記です。
テスト0 テスト1 テスト2 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at sample.Main.main(Main.java:9)
for文で「i <= strArr.length」と記述していることにより「strArr[3]」の要素にまでアクセスしようとして発生したエラーです。
上述したようにインデックスは「0」から開始されるため、「String[3]」で配列を作成した場合にアクセス可能な要素は「strArr[0]」「strArr[1]」「strArr[2]」の3要素となります。
対策
ArrayIndexOutOfBoundsExceptionの対策は、配列のインデックス要素が正しく指定出来ているかを確認することが大切です。
またサンプルのように繰り返し処理を行う場合に良く利用される「配列.length」の処理では、インデックス番号が「0」から始まることを考慮して繰り返し回数を制御することを意識しておきましょう。
さいごに: Javaのエラー対応には慣れも必要
本記事では、Javaにおけるエラー解決の基本と頻出エラーについてご紹介してきました。
記事内でも紹介しているようにエラーはきちんと読むことで修正すべき箇所を明示してくれています。
また大抵のエラーはGoogleで検索することにより解決方法を見つけることが可能です。
エラーの対応をスムーズに行うためにはある程度の慣れも必要となるため、最初は焦らずしっかりとエラー内容を確認して問題を解決出来るようにチャレンジしてみましょう。