-1

テキスト ファイルに書き込んでデータベースをエミュレートするプログラムを作成しようとしています。使用するデータでいっぱいのテキスト ファイルを読み取り、それをバイト配列に変換して別のテキスト ファイルに格納することができます。私が抱えている問題は、文字列からバイト配列に変換しているときに、java.lang.ArrayIndexOutOfBoundsException: 8 が発生し続けることです。配列ですが、何も問題を解決していないようです。エラーが表示される関数は次のとおりです。

public void writeBucket(int bucket, String importFile, String[][] allrecords)
{

  theDisk = new FakeDisk();

  for(int z = 0; z < bucket; z++)
  {

    try
     {

      for(int j = 0; j < 7; z++)//for(int j = 0; j < allrecords[z].length; z++)
      {

        if(allrecords[z][j] == null) //this is the line where the error shows up
        {
          continue;
        }

        theDisk.writeSector(z, allrecords[z][j].getBytes());
      }
     }
     catch(Exception e)
     {
         //System.out.println(e.getMessage());//this prints the number 8 when not commented out
       continue;
     }

  }

  try
  {

    FileWriter fwrite = new FileWriter(importFile);

    fwrite.write("\n\n\n\n");
    fwrite.close();

  }
  catch (Exception e)
  {
    System.err.println("Error: " + e.getMessage());
  }

}

ループを try/catch に入れて、少なくともバイトをテキスト ファイルに出力し、無効なインデックスにヒットしたらそれ以上ファイルに追加しないと考えましたが、そうではありません。主に、このエラーが発生し続ける理由を理解するのに苦労しています。配列を問題なく出力でき、テキスト ファイルに書き込もうとしなければすべてが表示されます。

どんな助けでも大歓迎です!

4

4 に答える 4

5

これが問題です:

for(int j = 0; j < 7; z++)

ループの初期化とループ条件を見てください。どちらもj- を使用しています。次に、 の値を変更しているインクリメントzを見てください。

コメントアウトされたバージョンでさえ、まだインクリメントしているため、まだ壊れていますz

j実際、私が見る限り、あなたはまったく必要ありません。内部ループを次のように変更できます。

for (String text : allrecords[z])
{
    if (text == null)
    {
        continue;
    }
    theDisk.writeSector(z, text.getBytes());
}

ただし、そもそもエンコーディングなしで呼び出さないことを強くお勧めします。デフォルトのプラットフォーム エンコーディングが本当にgetBytes()必要な場合は、それを明示的に指定します。UTF-8 などの他のエンコーディングが必要な場合は、それを指定します。必要なエンコーディングがわからない場合は、一歩下がってデータについて慎重に考える必要があります。

(毎回writeSector同じ値で呼び出しているのも少し奇妙です...データを上書きするだけではありませんか?)z

于 2012-10-16T06:20:37.413 に答える
1

内側のループでは、z++ ではなく j++ にする必要があります。

for(int j = 0; j < 7; j++)
于 2012-10-16T06:21:33.570 に答える
1

You have the answer, you could use commented loop (well instead of z++, use j++):

for(int j = 0; j < 7; z++)  //for(int j = 0; j < allrecords[z].length; j++)
于 2012-10-16T06:19:45.290 に答える
-1

これを試してみてください。この方法では、ArrayIndexOutOfBoundException. 配列の場合2d 、.length は最初のインデックスの長さを示します。allrecords[z].length2 番目のインデックスの長さを指定します。

for(int z = 0; z < allrecords.length; z++)


for(int j = 0; j < allrecords[z].length; z++)
于 2012-10-16T06:22:10.233 に答える