硬编码范围内的ArrayIndexOutOfBoundsException

时间:2019-03-21 05:27:21

标签: java arrays indexoutofboundsexception

正在做一个作业,我应该将文件中的数据读入数组以进行一些搜索/排序演示。

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)

使用该索引进行多次迭代之后。不确定从哪里开始进行故障排除。

1 个答案:

答案 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个元素的数组。