【Java初心者向け】ArrayIndexOutOfBoundsExceptionとは?原因・解消方法

【Java初心者向け】ArrayIndexOutOfBoundsExceptionとは?原因・解消方法

配列を使っていて、突然「ArrayIndexOutOfBoundsException」というエラーに出会ったことはありませんか?このエラーは初心者がよく陥る落とし穴です。

今回は、この「ArrayIndexOutOfBoundsException」というエラーの意味と発生する原因、そして対処方法について解説します。

なお、この解説記事は、未経験者向け無料プログラミングスクール「アキバ・テックドリーム・アカデミー」(以下、テクドリ)の講師であり、テクドリ運営企業のメディアファイブ株式会社(以下、メディアファイブ)に所属する現役エンジニア社員が執筆したものです。

目次

    ArrayIndexOutOfBoundsExceptionとは

    ArrayIndexOutOfBoundsExceptionとは、不正なインデックスを使って配列にアクセスされた場合にスローされる例外です。

    「不正なインデックスを使う」とは、下記のような場合です。

    • インデックスが負の数
    • インデックスが配列のサイズ以上の数

    配列やインデックスについて、詳しくは以下の記事をご参照ください。

    【Java】配列とは?宣言・代入・初期化など未経験者向けに解説 - TECH DREAM
    この記事では、テックドリームの講師がプログラミングについて、未経験の方にも分かり...
    tech-dream.school

    ArrayIndexOutOfBoundsExceptionが発生する例と解消方法

    インデックスが負の数の場合

    配列から値を取り出す際に、インデックスに負の数(0より小さい数)を指定している場合、ArrayIndexOutOfBoundsExceptionが発生します。

    配列から値を取り出す際に、インデックスに負の数(0より小さい数)を指定している場合、そのインデックスにアクセスしようとしたタイミングでArrayIndexOutOfBoundsExceptionが発生します。

    例外が発生するサンプルコード

    class Sample {
    
      public static void main(String[] args) {
    
        // 配列を初期化
        String[] strArray = {"あ", "い", "う", "え", "お"};
    
        int index = 0;
    
        // 配列の最初に格納されている値を表示
        System.out.println(strArray[index - 1]);
      }
    }
    実行結果
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 5
    	at Sample.main(Sample.java:11)

    サンプルでは、下記のように配列のインデックスが0から始まることを意識しすぎて、ArrayIndexOutOfBoundsExceptionが発生してしまいました。

    • インデックスを0で設定する。
      int index = 0;
    • インデックスから1を引く。
      strArray[index - 1]

    どちらかを修正すれば良いのですが、今回はindexを「1番目の値」と考えて以下のように修正します。

    解消例

    class Sample {
    
      public static void main(String[] args) {
    
        // 配列を初期化
        String[] strArray = {"あ", "い", "う", "え", "お"};
    
        int index = 1;
    
        // 配列の最初に格納されている値を表示
        System.out.println(strArray[index - 1]);
      }
    }
    実行結果

    インデックスが配列のサイズ以上の数の場合

    インデックスに配列のサイズ以上の数を指定している場合、そのインデックスにアクセスしようとしたタイミングでArrayIndexOutOfBoundsExceptionが発生します。

    インデックスに配列のサイズ以上の数を指定している場合、そのインデックスにアクセスしようとしたタイミングで
    ArrayIndexOutOfBoundsExceptionが発生します。

    例外が発生するサンプルコード

    class Sample {
    
      public static void main(String[] args) {
    
        // 配列を初期化
        int[] array = {-1, 0, 1, 2, 3};
    
        for (int i = 0; i <= array.length; i++) {
    
          // 配列に格納されている値を順番に表示
          System.out.println(array[i]);
        }
      }
    }
    実行結果
    -1
    0
    1
    2
    3
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
    	at Sample.main(Sample.java:11)

    解消例

    インデックスは0から始まるため、配列のサイズより1つ小さい値までしかない事に注意しましょう。

    class Sample {
    
      public static void main(String[] args) {
    
        // 配列を初期化
        int[] array = {-1, 0, 1, 2, 3};
    
        for (int i = 0; i < array.length; i++) {
    
          // 配列に格納されている値を順番に表示
          System.out.println(array[i]);
        }
      }
    }
    
    実行結果
    -1
    0
    1
    2
    3

    コマンドライン引数のよくある間違い

    コマンドライン引数が配列である事を認識しておらず、この例外を引き起こすことがあります。

    プログラミング初心者の方によくある間違いの一つです。

    上記で解説した「インデックスが配列のサイズ以上の数の場合」と同じ現象が起こります。

    サンプルコード

    class Sample {
    
      public static void main(String[] args) {
    
        // コマンドライン引数を表示
        System.out.println(args[0]);
      }
    }
    例外が発生する実行コマンドと結果
    C:\JAVA>java Sample
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
            at Sample.main(Sample.java:6)

    解消例

    コマンドライン引数を利用する際には、実行時に引数を渡す事を忘れないようにしましょう。

    C:\JAVA>java Sample 100
    100

    ArrayIndexOutOfBoundsExceptionのまとめ

    今回は、プログラミング初心者が最初につまづく例外のひとつ、
    ArrayIndexOutOfBoundsExceptionについて解説しました。

    ArrayIndexOutOfBoundsExceptionとは、不正なインデックスを使って配列にアクセスされた場合にスローされる例外で下記のような場合に発生します。

    • インデックスが負の数
    • インデックスが配列のサイズ以上の数

    配列のインデックスが原因で起こる例外なので、「ArrayIndexOutOfBoundsException」発生時には、配列使用箇所の「インデックスが正しいか」に注目しましょう。

    まずは選考会へ!

    「プログラマーになって一緒に働きませんか?」
    テックドリームの選考会は、選考だけでなく「相互理解」の場。不安なことも直接ご相談いただけます。


    電話でのご予約

    Webかんたん予約ができない場合や、ご質問がございましたら、
    お気軽にお電話ください。

    0120-262-242
    9:00~18:00(土日祝を除く)

     

    >テクド・リム

    テクド・リム


    「テックドリーム」の公式キャラクター。
    プログラマーだった父の影響を受けて、
    夢に向かって日々勉強に励むプログラマーのタマゴ。
    夢は「世界を変える、すごいプログラマーになること!」

    CTR IMG