1

諦めたいけど、やらなきゃいけないから、あなたが最後の希望です。簡単な問題だと思いますが、何が問題なのかわかりません。コードは次のとおりです。

    int i = -1;
    String[][] dan = new String[20][13];
    try {
     FileReader odczytanie = new FileReader("Kontrahenci.txt");
     BufferedReader bufor = new BufferedReader(odczytanie);
     String str;
     str = bufor.readLine();
     System.out.println(str);
     while ((str = bufor.readLine()) != null) {
        i = i + 1;
        String[] ar = {null, null, null, null, null, null, null, null, null, null, null, null, null};
        ar=str.split("; ");
        for(int j = 0; j < 13; j++)
            dan[i][j] = ar[j];
        for(int j = 0; j < 13; j++)
            System.out.println(dan[i][j]);  
     }
     bufor.close();
    } catch (IOException e) {
           System.out.println("File Read Error");
        }

したがって、実行しようとすると、次のエラーが表示されます。

"Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1"

この行の場合:

for(int j = 0; j < 13; j++)
    System.out.println(ar[j]);

ファイルには、単語がセミコロンで区切られた 3 行があります。コードは最初の行で完全に機能しますが、エラーが発生した後です。何が悪いのかわかりません。

4

3 に答える 3

0
String[] ar = {null, null, null, null, null, null, null, null, null, null, null, null, null};
ar=str.split("; ");

arこのwith 13 null 値の宣言はによってすぐに上書きされるstr.split("; ");ため、配列のサイズが常に 13 であると想定することはできません。for ループの上限として 13 を使用する代わりに、for を使用ar.lenまたは試すことをお勧めします。各ループ。

アレイにも同じことがあるとIndexOutOfBoundsError思います。dan

マジック ナンバーの使用は避けてください。

于 2013-05-31T16:11:40.393 に答える
0

配列を作成する前にファイル内の行数を把握するか、サイズを変更できるものに切り替える必要があります。

ArrayList<String[]> dan = new  ArrayList<String[]>();
try
{
    BufferedReader bufor = new BufferedReader(new FileReader("Kontrahenci.txt"));
    while (bufor.ready())
    {
        dan.add(bufor.readLine().split("; "));
    }
    bufor.close();
}
catch (IOException e)
{
    System.out.println("File Read Error");
}

for(String[] ar : dan)
{
    for(String s : ar)
    {
        System.out.println(s);
    }
}

エラー処理は変更していませんがclose、例外が発生した場合は呼び出さないことに注意してください。

于 2013-05-31T18:01:52.510 に答える
0

13 をハードコーディングするのは少し疑わしいようです。設定した値はar、分割への割り当てによって上書きされます。ar は必ずしも 13 個のフィールドを持つ必要はなくなりました。どうですか

for (int j = 0; j < ar.length ; j++)

またはさらに良い

for (String s: ar) 

そのデータは何らかの形で不正であるか、期待したものではないはずです。正しいサイズを主張するか、印刷してみてください。

また、Jerry が指摘したように、固定サイズの配列は悪い習慣です。List of HashMaps のような高レベルのコレクションや、自動的に成長する何かを使用したほうがよいでしょう。

i < 20応急処置は、 i でインデックスを作成する前にそれを確認してから、例外またはアサートをスローすることです。それはあなたを正しい方向に向けるでしょう。while ループに追加することもできますが、データが読み取られないままになる可能性があります。

于 2013-05-31T16:08:36.907 に答える