• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ArrayIndexOutOfBounds例外)

ArrayIndexOutOfBounds例外の原因と解決方法

このQ&Aのポイント
  • 下記のコードでArrayIndexOutOfBounds例外が発生しています。
  • 問題は、生成した二次元配列の範囲外にアクセスしようとしていることです。
  • 解決方法は、配列のサイズを適切に設定するか、配列にアクセスする前に範囲チェックを行うことです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

質問文中のプログラム (の断片) と全然違うじゃん. これじゃぁ, 書かれても意味ないよ.... t の初期化を static String[][] t = new String[167][10]; としてみたけど, うちの環境 (Windows 7 Ultimte, 64bit, java のバージョンは 1.6.0_24) では「10→9にすると問題なく動くが」のところを 10 にしたままでもまったく問題ない (というか ArrayIndexOutOfBoundsException は出ない) ですねぇ. うん, 今 1.7.0_03 にしたけどやっぱり出ない. 「実は t の初期化のときに要素数を間違えている」とかいうオチ (つまりは #6 の指摘の通り) だったりして. t.length とか t[0].length とか t[166].length とかって見た?

madamadadawa
質問者

お礼

Tacosan様 たびたびのコメントありがとうございます。 解決しました。 これまでお二人にご指摘いただいていた通りの個所が原因でした。 2箇所ありました。 一箇所は、ご指摘の通り、167行10列のつもりの配列が、t[98]が9列になっていました。 そして、もう一箇所は、xに自分のつくったtestクラスから数値を代入しているつもりで代入できていませんでした。NO.3へのお礼で「Testクラスからではなく、直接代入してもダメでした。」と記入していますが、これは、上記のt[98]が9列になっていたことが原因でした。t[98]を10列になおし、xへの代入方法を変えると、ArrayIndexOutOfBoundsExceptionは出ずに、動くようになりました。 Tacosan様とaskaaska様、お二人のどちらもベストアンサーとさせていただきたいのですが、システム上、一人しかできませんので、修正する具体的手がかりをいただいたTacasan様をベストアンサーとさせていただきます。 askaaska様にも本当に的確なアドバイスをいただき心より感謝申し上げます。

その他の回答 (6)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.6

実際に発生しているのは t[ra[i]][j];  の場所だったりしない?

madamadadawa
質問者

お礼

askaaska様 ご指摘ありがとうございます。 私もそこのところ怪しいと思いつつ、検証の仕方がわからず、確認できていないという状況です。検証できしだい、またご報告したいと思うのですが、取り急ぎ御礼申しあげます。 そこのところを考えてみようという覚悟をいただきました。ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

ごめん, どう確かめたのかが全くわからない. 可能なら, コマンドプロンプト上で実行できる「完全なプログラム」を出してもらえますか?

madamadadawa
質問者

お礼

Tacosan様 重ねてお世話になります。以下のコードで、コマンドプロンプトで確かめました。 import java.util.Random; class Array2{ static String[][] t = { 省略。167行10列のString型2次元配列。 }; static Random rand = new Random(); static int x =167 ; //要素数xで、0から166までの整数を重複なくランダムに並べた配列。 static int[] getrandomNo(){ int[] no = new int [x]; for(int i=0; i<x; i++){ int j; do{ j=0; no[i]=rand.nextInt(167);//最初の質問では1~167になるので修正。 for(; j<i; j++) if(no[j] == no[i]) break; } while (j<i); } return no; } //x行10列のStrin型2次元配列の生成。 static String[][] questionArray = new String[x][10]; //上記x行10列のString型2次元配列に、他の167行10列のString型配列から、ランダムにx行 //抽出し、さらに順序もランダムに変えて代入。 static String[][] getquestionArray(){ int []ra = getrandomNo(); for(int i=0 ;i<x ; i++) for(int j=0; j<10; j++) //このままだとArrayIndexOutOfBoundsException。10→9にすると問題なく動くが、10列目が //nullになる。ただ、実際に作成している環境では10→9に修正してもArrayIndexOutOfBoundsException。 questionArray[i][j] = t[ra[i]][j]; return questionArray; } //変数qAで上記配列を参照させる。 static String[][] qA = getquestionArray(); //メイン public static void main(String[] args){ //配列の大きさを表示。 System.out.println(qA.length); //xをとりあえず上で167で設定しているので167を表示。 //String型2次元配列の一部を表示。 System.out.println(qA[0][0]); //適切に表示。 System.out.println(qA[0][8]);//適切に表示。 System.out.println(qA[0][9]);//null System.out.println(qA[166][0]);//適切に表示。 System.out.println(qA[166][8]);//適切に表示。 System.out.println(qA[166][9]);//null } } 以上です。お時間使っていただき、本当にありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

配列の大きさは確認した?

madamadadawa
質問者

お礼

Tacosan様 重ねてのコメントありがとうございます。 確認していませんでしたので、コマンドプロンプトで実験してみました。 qA.lengthで、ArrayIndexOutOfBoundsException:9と出たので、for文中をj<9としてみたところ、 大きさを出してきました(xと同じ値になります)。 ここで、なぜj<9とすると出ないのか、自分の頭の中はけっこう混乱しているのですが、 さらに、元のプログラムでj<9としてみてもArrayIndexOutOfBoundsExceptionはやはり出てしまいさらにわからなくなっています。 また、何かご指摘いただければ幸いです。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

xに5より小さい値が入ったら ArrayIndexOutOfBoundsException になると思うけど

madamadadawa
質問者

お礼

askaaska様 重ねてコメントをいただきありがとうございます。 ご指摘の通り、 「xに5より小さい値が入ったらArrayIndexOutOfBoundsExceptionになる」のですが、 それより大きくても、やはりなるのです。 Testクラスからではなく、直接代入してもダメでした。 重ねてのご指摘、心より感謝です。 また、お気づきの点がございましたら、教えてください。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

xが与えられていないからでしょ?

madamadadawa
質問者

お礼

コメントありがとうございます。 申し訳ありません。私の質問記入の手落ちです。 変数xに対しては、Testクラスから1~167の数値を任意に代入して確認しています。 おそらく、そこ以外でコード記入の間違いをしていると思うのです。 何かお気づきの点あれば、他にもぜひお教えください。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

どのようなときに ArrayIndexOutOfBoundsException が出るかわかっていますか?

madamadadawa
質問者

お礼

Tacosan様 記入した欄が「補足」のほうでしたので、「お礼」が適切かと思いこちらに記入します。 コメントありがとうございました。 何か他にもお気づきの点あれば、どうぞよろしくお願いいたします。

madamadadawa
質問者

補足

配列として確保された領域を超えた場所にアクセスした場合に出る現象だと思っています。 どこで出ているのかわかりません。 なお、最初のxについては、上記のTestクラスから値を1~167の範囲で任意に代入しています。 よろしくお願いします。