我很擅长编程和为课堂作业工作。现在,我不是要求任何人为我编写代码,但我遇到了运行时错误。在赋值中我们需要读取一个文件,使用第一行“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”?我希望有人可以指出我逻辑中的缺陷,所以我不再重复了。
答案 0 :(得分:6)
你的问题显然是使用i
,因为这是该行唯一的变量索引,而超出范围的索引是“15”,这刚好超过你的15项的结尾阵列。所以,几个问题都围绕i
:
正如nawwig所提到的,在调用此函数之前,请确保i
实际上已初始化为0.
此外,您非常相信文件中项目编号的一致性和实际的项目数。您应该生成警告并停止尝试将项目存储在数组中i >= itemCount
,或者使用像ArrayList这样的容器来增加容纳新项而不是固定大小的数组。
编辑:此外,我应该指出,无论您是否阅读某个项目,都会增加i
,这意味着即使空白行也会增加i
,从而导致列表或数组中出现空白超支。由于itemCount
是项目的数字,因此如果您阅读了实际项目,则应该坚持使用,并且只会增加i
。
本着同样的精神,你应该在调用split()之后验证invData.length == 5
,因为文件中错误的逗号等也可能最终出现OOB错误。当然,对于您的项目,可以对以“生产”或“清理”开头的行中的元素数量进行假设,但一般来说,对来自用户创建的文件的数据保持谨慎是很重要的。 / p>
答案 1 :(得分:5)
我找到的答案是我需要一个“s.nextLine();”
因为我使用了“s.nextInt();”指针只是挂在我文件中“15”的末尾。然后,当While循环中的第一行“String line = s.nextLine();”时执行指针从15的末尾移动到列表文件的第2行中的p in产生之前。
工作方法如下:
public void readFile(String fileName){
try{
File invList = new File (fileName);
Scanner s = new Scanner(invList);
int itemCount = s.nextInt();
s.nextLine(); // This is the new line that made it work
list = new Product[itemCount];
count = itemCount;
while (s.hasNext()){
String line = s.nextLine(); //moves file pointer over one
invData = line.split(",");
if (invData[0].equals("produce")){
list[i] = new Produce(invData[1], invData[2], invData[3], invData[4]);
} 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
答案 2 :(得分:3)
您拨打readFile多少次?你应该在函数的开头有i = 0;
。
答案 3 :(得分:3)
“i”不应该是全局值,而应该是方法局部变量,初始化为零。