OutOfBoundsException Troubles, Java - PullRequest
       6

OutOfBoundsException Troubles, Java

1 голос
/ 03 февраля 2012

Я получаю следующую ошибку:

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 dotProduct:

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;
}

И мой основной метод (в другом классе) на всякий случай:

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));
        }
    }
}

Следует просто распечатать элементы dotProduct ArrayList ...

Я не понимаю, как строка 72 вызывает проблемы, поскольку я должен иметь возможность добавлять неограниченное количество элементов в ArrayList .... Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

6 голосов
/ 03 февраля 2012

Проблема в строке 72 связана с get(), а не с add().

Я подозреваю, что это может быть основной причиной проблемы:

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);
}

Во втором цикле for вы увеличиваете i, а не j.Это, вероятно, приведет к тому, что вы будете использовать значение i в строке

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

больше, чем размер pureRatingsList, что приведет к исключению, которое вы видите.

2 голосов
/ 03 февраля 2012

разве эта строка не проблема?

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

Я думаю, вам нужно

для (int j = 0; j j ++) {

1 голос
/ 03 февраля 2012

Вы знаете, что существуют такие вещи, как итераторы и foreach, упрощающие обход коллекции?

Проблема в том, что индекс списка начинается с 0, а вы пытаетесь начать с 1.

0 голосов
/ 03 февраля 2012

Это вызывает проблему, потому что вы запрашиваете индекс, который не существует; ergo "Вне границ".

Вы запрашиваете индекс 86, когда размер составляет только 86 (который является индексом 0 - 85). Массивы начинаются с нуля.

Обучение использованию отладчика действительно поможет вам решить подобные проблемы, поскольку вы можете пройтись по своей программе и точно увидеть, что происходит.

...