2012-02-03 12 views
1

私は次のエラーを取得していますが:OutOfBoundsExceptionのトラブル、Javaの

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 86, Size: 86 
at java.util.ArrayList.rangeCheck(ArrayList.java:604) 
at java.util.ArrayList.get(ArrayList.java:382) 
at Netbooks.Recommendations.getDotProduct(Recommendations.java:72) 
at Netbooks.TestRecomendations.main(TestRecomendations.java:11) 
Java Result: 1 

私は何度もコードを見てきたと私はArrayListのインデックスの上に行く場所を見つけることができないよう... 。

public List<Integer> getDotProduct() throws IOException { 
    Books book = new Books(); 
    Ratings cust = new Ratings(); 
    PureRatings pureRatings = new PureRatings(); 


    List<String> bookList = book.readBooks(); 
    List<String> customerList = cust.readCustomers(); 
    List<List<Integer>> pureRatingsList = pureRatings.parseRatingsFile(); 
    List<Integer> dotProduct = new ArrayList<Integer>(); 
    int index = getCustIndex(); 

    if (index == -1) { 
     return dotProduct; 
    } 

    for (int i = 0; i < customerList.size(); i++) { 
     int sum = 0; 

     for (int j = 0; j < bookList.size(); i++) { 
      if (i == index) { 
       dotProduct.add(0); 
      } else { //Next line is line 72. 
       sum = sum + (pureRatingsList.get(index).get(j)) * (pureRatingsList.get(i).get(j)); //Line 72. 
      } 
     } 
     dotProduct.add(sum); 
    } 

    return dotProduct; 
} 

そして、ちょうど場合(別のクラスでは)私の主な方法:

ここ

は、ドット積のArrayListのコードです

public class TestRecomendations { 

    public static void main(String[] args) throws IOException { 
     Recommendations recomm = new Recommendations(); 

     List<Integer> dotProduct = recomm.getDotProduct();//Line 11. 

     for (int i = 0; i < dotProduct.size(); i++) { 
      System.out.println(dotProduct.get(i)); 
     } 
    } 
} 

それはちょうど私がArrayListにアイテムを無制限に追加することができるはずですので、私はライン72が問題を引き起こしているかを理解していない...

のドット積のArrayListの要素をプリントアウトする必要があります....どんな助けもありがとう。

+1

インデックスは0から基づいています。 86番目のアイテムのリストについては、87番目のアイテム(インデックス86)にアクセスしています。索引変数が乱雑になっている可能性があります。 (例えば、あなたは[0、 'customerList.size'から' i'を反復しますが、 'pureRatingsList.get' ...で' i'を使うなど) –

+3

デバッガを使ってみましたか? java.lang.IndexOutOfBoundsExceptionにブレークポイントを設定し、ブレークポイントが破損する理由を確認してください。 – Axel

答えて

6

72行目の問題は、add()ではなく、get()です。

私は、これが問題の根本原因である可能性が疑われる:

forループ秒で
for (int i = 0; i < customerList.size(); i++) { 
    int sum = 0; 

    for (int j = 0; j < bookList.size(); i++) { 
     if (i == index) { 
      dotProduct.add(0); 
     } else { //Next line is line 72. 
      sum = sum + (pureRatingsList.get(index).get(j)) * (pureRatingsList.get(i).get(j)); //Line 72. 
     } 
    } 
    dotProduct.add(sum); 
} 

、あなたがiなくjをインクリメントしています。それはおそらくあなたが見ている例外で、その結果、pureRatingsListのサイズよりも大きいライン

sum = sum + (pureRatingsList.get(index).get(j)) 
    * (pureRatingsList.get(i).get(j)); 

iの値を使用して、あなたになります。

+1

(+1)よく見つかった! – NPE

+0

ありがとう!私はjとjを置き換えて、今は正常に動作します。その常に単純な間違い... – Marcos

1

コレクションをトラバースするのを簡単にするためにイテレータやforeachのようなものがあることは知っていますか?

問題は、リストのインデックスは0から始まり、あなたはが存在しないインデックスを要求しているので、それが問題を引き起こしている1.

+0

今日はイテレーターについてほとんど学ばず、効率的に使用するには十分理解していませんが(私はそれらを勉強するつもりはありますが)...インデックスはどこから始めますか? – Marcos

0

で起動しようとすることです。エゴ "Out of bounds"。

サイズが86(インデックスは0〜85)の場合は、インデックス86を要求しています。配列はゼロベースです。

デバッガを使用することを学ぶことで、プログラムをステップ実行して何が起こっているかを正確に確認できるので、このような問題を解決するのに役立ちます。

2

この行に問題はありませんか?

for (int j = 0; j < bookList.size(); i++) {

私はあなたが必要なものを推測するための

です(int型J = 0; jの< bookList.size(); J ++){

関連する問題