正在做一个作业,我应该将文件中的数据读入数组以进行一些搜索/排序演示。
public class A5 {
public static void main(String[] args) throws FileNotFoundException, IOException {
fileToArray();
}
/**
* populates array from file
* @throws IOException
* @throws FileNotFoundException
*/
public static <T extends Comparable<T>> void fileToArray() throws IOException, FileNotFoundException {
int FileIndex = 0;
A5GItem[] gItems = new A5GItem[5150];
File file = new File("GroceryData.txt");
Scanner inputFile = new Scanner(file);
while (inputFile.hasNext()) {
String line = inputFile.nextLine().replace(" oz", "").replace("«", "");
String[] tokens = line.split(";");
if (tokens.length == 5) {
System.out.println(tokens[0]);
System.out.println(tokens[1]);
System.out.println(tokens[2]);
System.out.println(tokens[3]);
System.out.println(tokens[4]);
System.out.println(FileIndex);
FileIndex++;
else {
System.out.println("Bad line: " + line);}
} }`
我试图通过循环一些println语句来测试是否正确填充了数组。它会正确标记列表中的前400个(大约)元素,然后仅打印最后一个标记的一半并抛出
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at A5.fileToArray(A5.java:59)
at A5.main(A5.java:16)
使用该索引进行多次迭代之后。不确定从哪里开始进行故障排除。
答案 0 :(得分:0)
很显然,文件“ GroceryData.txt”中的其中一行不包含5个标记。请注意,方法split()
返回的数组的大小可能不为5。因此不必初始化变量tokens
。似乎变量FileIndex
对读取的行进行计数,因此我建议在tokens
之后打印它以及打印数组split()
的大小,例如
while (inputFile.hasNext()) {
String line = inputFile.nextLine().replace(" oz", "").replace("«", "");
String[] tokens = line.split(";");
FileIndex++;
System.out.println("Line: " + FileIndex + " has " + tokens.length + " tokens.");
}
然后,您将发现文件的哪一行不符合您的预期。
顺便说一句,关于评论者提到的命名约定,就是这样-一个约定。这不是导致您的ArrayIndexOutOfBoundsException
此外,您发布的堆栈跟踪指示代码的第59行包含该问题。我相信就是这条线...
System.out.println(tokens[2]);
打印数组的元素假定它包含5个元素,但是正如我和其他人所提到的,方法split()
可能不会返回5个元素的数组。