gpt4 book ai didi

java - 为什么我得到一个 "ArrayIndexOutOfBoundsException"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:05:00 27 4
gpt4 key购买 nike

我对编程和处理类作业还很陌生。现在,我不要求任何人为我编写代码,但我遇到了运行时错误。在我们需要读取文件的作业中,使用第一行“15”来初始化数组的大小,然后用每一行的信息填充数组。

编辑:我不想发布所有代码,因为我认为它看起来太长了,但由于含糊不清而遭到否决,就在这里。

文件:

15
produce,3554,broccoli,5.99,1
produce,3554,broccoli,5.99,1
produce,3555,carrots,2.23,0.25
produce,3555,carrots,2.23,0.25
produce,3555,carrots,2.23,0.25
cleaning,2345,windex,5.99,1 unit
cleaning,2345,windex,5.99,1 unit
cleaning,2345,windex,5.99,1 unit
cleaning,2345,windex,5.99,1 unit
cleaning,2346,toilet paper,12.99,4 rolls
cleaning,2346,toilet paper,12.99,4 rolls
cleaning,2335,windex,2.25,1 mini sprayer
cleaning,1342,wipes,3.99,10 units
cleaning,1342,wipes,3.99,10 units
produce,3546,lettuce,2.99,0.5

我的错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 15
at Inventory.readFile(Inventory.java:45)
at Inventory.<init>(Inventory.java:12)
at Supermarket.main(Supermarket.java:3)

用问题中的第 45 行分类(第 45 行有注释,向右滚动)”

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class Inventory{
Product[] list;
String[] invData;
private int i = 0;
public int count;

public Inventory (String f){
readFile(f);
}

public int indexOfProduct(int code){
for(i=0; i<list.length; i++){
if (list[i] != null)
if (list[i].getCode() == code)
return i;

}
return -1;
}


public Product delete(int pos){
Product temp = new Product();
temp = list[pos];
list[pos] = null;
return temp;
}

public void readFile(String fileName){
try{
File invList = new File (fileName);
Scanner s = new Scanner(invList);
int itemCount = s.nextInt();
list = new Product[itemCount];
count = itemCount;
while (s.hasNext()){
String line = s.nextLine();
invData = line.split(",");
if (invData[0].equals("produce")){
list[i] = new Produce(invData[1], invData[2], invData[3], invData[4]); // This is Line 45, Where the error occurs
} else if(invData[0].equals("cleaning")){
list[i] = new Cleaning(invData[1], invData[2], invData[3], invData[4]);
}
i++;
}//end of while loop
} catch (FileNotFoundException Abra) {
String error = Abra.getMessage();
System.out.println(error);
}
} // end of method

public Product findCode(int c){
for(int i=0; i<list.length;i++)
if(list[1].getCode() == c)
return list[i];
return null;
}//end of method
}//end of class

为什么我会收到“ArrayIndexOutOfBoundsException”?我希望有人能指出我逻辑上的缺陷,这样我就不再重复了。

最佳答案

您的问题显然与 i 的使用有关,因为这是该行中唯一的变量索引,超出范围的索引是“15”,刚好超过您的结尾15 项数组。所以,有几个问题,都围绕着 i 的使用:

正如 nhellwig 提到的,在调用此函数之前,请确保 i 实际上已初始化为 0。

此外,您非常相信文件中项目编号与实际项目数量的一致性。如果 i >= itemCount,您应该发出警告并停止尝试将项目存储在数组中,或者使用像 ArrayList 这样可以增长以容纳新项目的容器而不是固定大小的数组。

编辑:此外,我应该指出,无论您是否阅读某个项目,您都会递增 i,这意味着即使是空行也会递增 i,从而导致列表中的空白或数组溢出。由于 itemCount 是项目的数量,您应该坚持这一点,并且只有在阅读实际项目时才增加 i

本着同样的精神,您应该在调用 split() 后验证 invData.length == 5,因为文件中放错位置的逗号等也可能导致 OOB 错误.当然,对于您的项目,假设一行中以“produce”或“cleaning”开头的元素数量可能没问题,但一般来说,谨慎对待来自用户创建文件的数据很重要。

关于java - 为什么我得到一个 "ArrayIndexOutOfBoundsException"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18070661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com