Java
log
ログ
初心者
新人プログラマ応援

【Java】エラーメッセージをちゃんと読んでいますか?【スタックトレースの読み方】

はじめに

(ブルゾンちえみ風味で)
はい、みなさん、仕事or研修~ :bangbang:
え?プログラムが吐いたエラーの意味がわからないって :question:
ダメPG :musical_note:
じゃあ質問です。
あなたは、エラーメッセージを、ちゃんと読んでいますか?
 :musical_note: (Dirty work by Austin Mahone) :musical_note:
(英語だからって)逃げない、向き合うの :heart:

エラーメッセージを読む順序

のっけからハイテンションですみません :bow:
そういえば、エラーの読み方って研修とかで教わらないような気がします。
エラーメッセージは全部英語ですが、ポイントさえ押さえればちゃんと解読できます。
以下のエラーサンプルを使って、順を追って読んでいきましょう:notebook_with_decorative_cover:
※新人さん:beginner:向けの内容(のつもり)なので、ゆっくりペースでエラーを読んでいきますね。

サンプルプログラム.java
package section01;

import java.util.Random;

/*
 * ランダム配列の生成
 * オーダー:2Nパターン
 */
public class practice4 {

    public static int NUM = 10;

    public static void main(String[] args) {
        int[] numArray = new int[0]; /* 要素数ゼロの配列を宣言している */
        Random random = new Random();

        int i, randomNum;
        for(i = 0 ; i < NUM ; i++) {
            numArray[i] = i; /* ここでexceptioが発生する */
        }

        for(i = NUM-1 ; i > 1 ; i--) {
            randomNum = random.nextInt(NUM-1);
            int tmp = numArray[randomNum];
            numArray[randomNum] = numArray[i];
            numArray[i] = tmp;
        }

        for(i = 0 ; i < NUM ; i++) {
            System.out.println(Integer.toString(numArray[i]));
        }
    }
}
エラーサンプル
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at section01.practice4.main(practice4.java:20)★

1)エラーメッセージのスタート地点までゆっくり戻る

エラーメッセージが一通り出力された状態では、カーソルが一番下まで下りています。
サンプルでいうと、(practice4.java:20)の次にある★の個所です。
なので、画面をスクロールして、エラーメッセージが出力されたスタート地点までゆっくり戻りましょう:arrow_left:慣れれば一気に戻れるようになります。
マウス:mouse_three_button:のホイールをぐりぐりしながら、全体像を見てください。
ちなみに、サンプルなので2行で終わってますが、フレームワークを使っているともっとたくさん出てきます:computer:

2)一番先頭にある「Exception」や「Error」の文字を探す

サンプルでいうとException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0の個所です。
他には、

  • NullPointerException
  • NumberFormatException
  • OutOfMemoryError

などなど。
これが、エラーの内容になります。
意味不明で構わないので、まずはException / Errorを探してください。
大事なのは、「意味わかんないけど、NullPointerExceptionっていうエラーが発生しているんだな」と認識することです。

3)動かしたプログラムのクラス名を探す

Javaに限らず、たいていのプログラミング言語は、エラーが発生した場所を「どのファイルの何行目か」って出力してくれます。
なので、まずは自分が動かしたプログラムのクラス名を探しましょう :exclamation:
サンプルだとat section01.practice4.main(practice4.java:20)の個所です。
ここまでくれば、

  • practice4.javaの20行目でエラーが発生している。
  • エラーの内容は「ArrayIndexOutOfBoundsException」である。

の2つがわかったので、practice4.javaの20行目で発生している、ArrayIndexOutOfBoundsExceptionを解消するようにプログラムを修正してください:stuck_out_tongue:
わからなければ、「○○のn行目で△△というexceptionが発生したのですが、どうやって解消すればいいですか?」って聞いてしまいましょう。

エラーメッセージの勘

毎回ググってると、だんだん覚えてくるので、毎回ググるようなことはなくなってきます。
そうすると、単語の一部を見ただけで「自分がどんな間違いをしているのか」という見当がつくようになってきます。
さらに、たいていのプログラミング言語 or SQLは、エラーメッセージに似たような英単語を使っていることが多いので、言語問わずある程度の推測が可能になります。

意味や読み方がわからなくてもエラーの内容がわかるようになりますよ:star: