2013-08-06 4 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 

マイエラー:問題のライン45と

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はコメント化されて、右にスクロール)」

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

はい、本当にメソッドlocalsであるべきであるいくつかのグローバル変数があります。 –

答えて

3

あなたは何回readFileを呼び出しますか?関数の先頭にはi = 0;が必要です。

3

"i"はグローバル値ではありませんが、ゼロに初期化されたメソッドローカル変数である必要があります。

6

あなたの問題は明らかにその行の唯一の可変インデックスであるiを使用しており、範囲外インデックスは15アイテムの配列の最後を過ぎている "15"です。したがって、この問題を回避するには、i

のように、この関数を呼び出す前に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();"リストファイルの2行目の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」をインクリメントするだけで、より堅牢なソリューションになります。良いキャッチは、それを修正するが、あなたは本当にここに他の答えで与えられたアドバイスを無視すべきではありません。 –