我正在尝试编写一个通过写入文本文件来模拟数据库的程序。我可以读取一个充满数据的文本文件,然后将其转换为字节数组以存储到另一个文本文件中。我遇到的问题是因为我正在从字符串转换为字节数组我不断得到java.lang.ArrayIndexOutOfBoundsException:8。我将值硬编码到我的for循环中,因此它不应该是一个无效的索引数组但似乎没有解决问题。这是我的函数,错误显示在:
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中,认为它仍然至少将字节输出到我的文本文件,然后一旦它到达无效索引就不再添加到文件中,但事实并非如此。我主要是在弄清楚为什么我一直收到这个错误。我可以打印出阵列没有问题,如果我不尝试将其写入文本文件,一切都会显示出来。
感谢任何帮助!
答案 0 :(得分: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
的{{1}}调用z
时,有点奇怪......是不是只会覆盖数据?)
答案 1 :(得分:1)
你有答案,你可以使用评论循环(而不是z++
,使用j++
):
for(int j = 0; j < 7; z++) //for(int j = 0; j < allrecords[z].length; j++)
答案 2 :(得分:1)
在内部循环中,它应该是j ++,而不是z ++:
for(int j = 0; j < 7; j++)
答案 3 :(得分:-1)
试试这个,这样你就不会得到ArrayIndexOutOfBoundException
。在2d
的情况下
array,.length将给出第一个索引的长度。
并且allrecords[z].length
将给出第二个索引的长度。
for(int z = 0; z < allrecords.length; z++)
for(int j = 0; j < allrecords[z].length; z++)