Java ArrayIndexOutOfBoundsException在硬编码边界内

Java ArrayIndexOutOfBoundsException在硬编码边界内,java,arrays,indexoutofboundsexception,Java,Arrays,Indexoutofboundsexception,我正在做一个作业,在这个作业中,我应该将文件中的数据读入数组,以进行一些搜索/排序演示 public class A5 { public static void main(String[] args) throws FileNotFoundException, IOException { fileToArray(); } /** * populates array from file * @throws IOException * @throws FileNotFoundExc

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

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个元素,然后只打印最后一个标记的一半并抛出

主线程java.lang.ArrayIndexOutOfBoundsException中的异常:2 在A5.fileToArrayA5.java:59 在A5.mainA5.java:16


在多次迭代使用该索引之后。不确定从何处开始故障排除。

显然,文件GroceryData.txt中的一行不包含5个令牌。请注意,方法split返回的数组的大小可能不是5。因此,不需要初始化变量标记。似乎variable FileIndex会计算读取的行数,因此我建议打印它,并在拆分后打印数组标记的大小,例如

然后,您将发现文件的哪一行不是您所期望的

顺便说一下,关于评论者提到的命名约定,它只是一个约定。这不是导致你的ArrayIndexOutofBounds感觉的原因

另外,您发布的堆栈跟踪表明代码的第59行包含问题。我相信这就是这条线

System.out.println(tokens[2]);

打印数组的元素假定它包含5个元素,但正如我和其他人提到的,方法split可能不会返回5个元素的数组。

tokens=line.split;;:这看起来并不是硬编码的……我假设上面的一行设置了边界,因为java命名约定的标记数从来没有超过5个。变量名必须以小写字符开头。直接打印行,这应该是解决此问题的良好开端。您使用FileIndex的目的是什么?由于您使用的是扫描仪,下一步是逐行扫描。正如@Jens所写的:驼峰格表示法。没有以大写字母开头的变量。第59行是什么?先试试我的建议。你需要调试你的代码,而不仅仅是浏览它。我建议的是一种简单的方法来定位可能导致异常的原因。查找导致异常的行不是问题,我在上面发表了一条评论。品系为山毛榉坚果2期;混合蔬菜;4盎司;5.67;6047我看不出它与之前的系列山毛榉坚果2期有什么不同;梨;4盎司;2.95;5925山毛榉坚果2期;梨和菠萝;4盎司;7.27;6031山毛榉坚果2期;梨和覆盆子;4盎司;8.83;5731山毛榉坚果2期;胡桃南瓜;4盎司;1.39;5932山毛榉坚果2期;郊野蔬菜;4盎司;10.04;6046最后一个标记在Vegata上结束,Vegata已经多次拆分了字符串,但没有问题您找到了错误的行,但是您知道为什么它是错误的吗?显然它不包含5个代币。您知道该行拆分返回了多少令牌吗?另外,您发布的原始代码中的哪一行是第59行?2山毛榉坚果阶段2和混合蔬菜。第59行应该是System.out.PrintLNTokes[2];这看起来不像java代码。我指的是java代码的第59行。如果您使用的是像Eclipse这样的IDE,那么堆栈跟踪中应该有一个链接,可以直接将您带到代码中的那一行。
System.out.println(tokens[2]);