こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Javaでよくわからないエラーが出てしまいます。

こんにちは。

Javaでプログラムを作っている途中で

ArrayIndexOutOfBoundsException

というエラーが出てきました。
調べてみると"配列として確保された領域を 超えた場所アクセスした場合に発生"と書かれていました。
しかし、エラーの部分を見つけることができません。
以下に問題のプログラムを掲載します,問題点を指摘してもらいたいのです。

よろしくお願いします。

ちなみに開発環境はJava7です。
-------------以下プログラム-------------
import java.io.*;

public class Datain{
public static String[][] datain(){
String inputFileName;
String indata_1;
String[] indata_2 = new String[12];
String[][] mondata = new String[100][12];
int i = 0;
//読み込むファイル名
inputFileName = "H:\\問題データ.txt";
//ファイルオブジェクトの生成
File inputFile = new File(inputFileName);
try{
//入力ストリームの生成
FileInputStream fis = new FileInputStream(inputFile);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
//テキストファイルからの読み込み
while((indata_1 = br.readLine()) != null){
indata_2 = indata_1.split(",");
for(int z = 0;z < indata_2.length;z++){
mondata[i][z] = indata_2[z];
}
i++;
}
br.close();
}catch(Exception e){
e.printStackTrace();
}

return mondata;
}


public static void main(String[] args){
String[][] a;
a = datain();
System.out.println(a[0][0]);
}
}

-------------テキストファイル-------------

あいう,えおか,きくけ
こさし,すせそ,たちつ
てとな,にぬね,のはひ


※カンマ区切りの「.txt」ファイル

投稿日時 - 2011-11-19 01:05:50

QNo.7141325

困ってます

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

#1です。


>もしかしたら改行の関係で多少のずれがあるかもしれないので念のため記載しておきます。

#1でも書きましたが、エラーメッセージ情報は問題解決する上で、

 ■■■ 非常に重要な情報 ■■■

です。


ずれたのであれば、きちんとした正しい情報を元にデバッグ作業を開始してください。
(普通はそうします)

今回は「ずれていない」という前提で進めます。



java.lang.ArrayIndexOutOfBoundsException: 12
at Datain.datain(Datain.java:23)
at Datain.main(Datain.java:38)

これの意味は、

Datain.javaファイルの38行目(Datainクラスのmainメソッド)から呼び出された、
Datain.javaファイルの23行目(Datainクラスのdatainメソッド)

で、java.lang.ArrayIndexOutOfBoundsExceptionが発生したことを表示しています。


つまり最終的には、「Datain.javaファイルの38行目」がエラーの場所です。

補足に書かれたとおりだと、
mondata[i][z] = indata_2[z];
ということですので、
原因は、

・mondata[i][z] のi
・mondata[i][z] のz;
・indata_2[z] のz

のどれかです。

そこで、mondata[i][z] = indata_2[z];の前の行に、

System.out.println("デバッグ用情報 i=" + i + ",z=" + z);

という1行を挿入し、コンパイル後実行してください。


最後に表示されたこのメッセージの時にエラーとなります。

その情報と、配列の定義情報を見比べれば、直接のエラー原因が解明できるはずです。

投稿日時 - 2011-11-19 02:12:27

お礼

恥ずかしながら直接的な原因はデータにあったようです。
思いもよらぬところに","があり配列が知らぬ間に大きくなっていたようです。

なのでデバックの結果は,配列が小さかったためエラーが起きたので,zに原因があったようです。


本当にありがとうございました。

投稿日時 - 2011-11-19 09:24:19

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

mondata[i][z] = indata_2[z];
のところでiとzの値がどうなっているか確認しましたか?
その行で"配列として確保された領域を 超えた場所アクセスした場合に発生"する例外が発生したというのであれば、直接の問題はそこです。

投稿日時 - 2011-11-19 01:57:45

お礼

みなさんに言われたとおりにデバックを繰り返した結果,問題は配列が小さかったためとZに原因があることが判明しました。

ありがとうございました。

投稿日時 - 2011-11-19 09:21:21

ANo.2

本題とは関係ないけど
String[] indata_2 = new String[12];
における初期化ってなんのため?

投稿日時 - 2011-11-19 01:32:33

補足

その配列を使う部分でエラーが起きていたのでもしかしたらと思い,初期化処理を付け足してみました・・・。

なので特にプログラムを動かすうえでは意味はありません。

紛らわしくてすみません・・・。

投稿日時 - 2011-11-19 01:45:01

ANo.1

そのメッセージと一緒に、そのエラーがどのファイルの何行目で発生したかが表示されているはずです。

それをよく読めば解決できると思います。
というか、上級者もその情報をたよりに問題を解決します。

もし、見方がわからないということなら、メッセージを省略せず、全部記載してください。

投稿日時 - 2011-11-19 01:26:48

補足

すみませんでした。

エラーメッセージを表示します。

java.lang.ArrayIndexOutOfBoundsException: 12
at Datain.datain(Datain.java:23)
at Datain.main(Datain.java:38)

と出ています。

ちなみに
23行目はこれです。…mondata[i][z] = indata_2[z];
38行目はこれです。…a = datain();
もしかしたら改行の関係で多少のずれがあるかもしれないので念のため記載しておきます。


よろしくお願いします。

投稿日時 - 2011-11-19 01:43:05

あなたにオススメの質問