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]);