2013-08-06 78 views
7

我很新的编程和工作分配给班级。现在,我并没有要求任何人为我编写代码,但我遇到了运行时错误。在分配中,我们需要读取一个文件,使用第一行“15”来初始化一个数组的大小,然后用每行的信息填充数组。为什么我得到一个“ArrayIndexOutOfBoundsException”?

编辑:我没有要发布的所有代码,因为我认为它看起来太长时间,但因为downvotes为是模糊的,在这里不言而喻。

文件:

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”?我希望有人能够指出我的逻辑中存在缺陷,所以我不再重复。

+2

也许您愿意,表示这是第45行?我们的Ouija董事会今天晚上工作不太好。 –

+1

另外你在哪里定义'list' –

+2

是的,你有几个全局变量,真的应该是方法当地人。 –

回答

3

你打电话给readFile多少次?在函数的开头应该有i = 0;

3

“我”不应该是一个全球性的价值,但应该是一个方法局部变量初始化为零。

6

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

由于nhellwig提到,确保i实际上被初始化为0之前调用此函数。

另外,你把一个很大的信心在文件中的项目数量和项目的实际数量的一致性。您应该产生警告并停止尝试将项目存储在数组中,如果i >= itemCount,或者使用像ArrayList容器可以增长以容纳新项目而不是固定大小的数组。

编辑:另外,我要指出,你增加i是否读取的物品或没有,这意味着即使空行将增加i,导致您的列表或阵列超支差距。由于itemCount是物品的编号,因此如果您阅读实际物品,则应该坚持这一点,并且只能增加i

出于同样的原则,在调用split()之后,您应该验证invData.length == 5,因为文件中错位的逗号等也可能以OOB错误结束。当然,对于你的项目,假设一行中以“产生”或“清除”开始的元素数量可能是可以的,但总的来说,谨慎处理来自用户创建文件的数据是很重要的。

5

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

因为我使用了“s.nextInt();”指针只是在我的文件中“15”的最后。然后,当While循环的第一行“String line = s.nextLine();”执行指针从15的末尾移动到列表文件的第二行中生成的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 
+0

只有在读取某个项目时才增加'i'将是一个更强大的解决方案。良好的发现,解决这个问题,但你真的不应该忽视这里其他答案中的建议。 –

相关问题