2013-08-06 119 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'將是一個更強大的解決方案。良好的發現,解決這個問題,但你真的不應該忽視這裏其他答案中的建議。 –

相關問題