7

我对编程和课堂作业很陌生。现在,我没有要求任何人为我编写代码,但我遇到了运行时错误。在赋值中,我们需要读取一个文件,使用第一行“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”?我希望有人能指出我逻辑中的缺陷,所以我不再重复。

4

4 回答 4

6

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

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

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

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

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

于 2013-08-06T02:11:38.240 回答
5

我发现答案是我需要一个“s.nextLine();”

因为我使用了“s.nextInt();” 指针只是在我的文件中“15”的末尾徘徊。然后,当 While 循环中的第一行“String line = s.nextLine();” 执行了从 15 末尾移动到列表文件第 2 行中产生的 p 之前的指针。

工作方法如下所示:

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
于 2013-08-06T15:40:52.120 回答
3

“i”不应该是一个全局值,而应该是一个方法局部变量,初始化为零。

于 2013-08-06T02:04:41.370 回答
3

你调用了多少次readFile?你应该i = 0;在函数的开头有。

于 2013-08-06T02:03:28.600 回答