LoginSignup
37
33

More than 3 years have passed since last update.

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

Last updated at Posted at 2017-12-08

はじめに

一生懸命書いたプログラムがエラーを吐いたとき、そのエラーメッセージをちゃんと読んでいますか?
「英語だからやだー:confounded:」って逃げていませんか?
そういえば、エラーの読み方って研修とかで教わらないような気がします。
エラーメッセージは全部英語ですが、ポイントさえ押さえればちゃんと解読できます。
(英語だからって)逃げない、向き合うの

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

以下のエラーサンプルを使って、順を追って読んでいきましょう: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; /* ここでexceptionが発生する */
        }

        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:

37
33
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
33