Можете ли вы получить IndexOutOfBoundException, когда список массивов, который вы пытаетесь перебрать, слишком велик? Или что-то не так с моими петлями? - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь перебрать массив, содержащий как минимум пару тысяч записей. Но вместо этого мне дали исключение IndexOutOfBoundEcxception. Я проверил свои итеративные циклы и не вижу в этом ничего плохого (я уверен, что я не пытаюсь достичь чего-либо за пределами массива). Что-то не так с моим вложением для l oop, или же массив, который я пытаюсь пройти, слишком велик?

    public String filterOrder() throws SQLException{    

        ArrayList<OrderDetails>od= this.getOrderDetails("orderdetails");
        ArrayList<orders>ord=this.getOrders();
        Map<Integer,Double>map=new HashMap<Integer,Double>();
        StringBuffer filter=new StringBuffer();


        for(int i=0;i<=ord.size();i++) {
            double tmp=0;
            for(int j=0; j<=od.size();j++) {

                if(ord.get(i).getOrderNumber()==od.get(j).getOrderNumber()) {

                    tmp=tmp+(od.get(j).getPriceEach()*od.get(j).getQuantityOrdered());

                }
                map.put(ord.get(i).getOrderNumber(), tmp);

            } 
            }

            for(Entry<Integer, Double> entry: map.entrySet()) {
                if(entry.getValue()>5000) {
                    filter.append(entry.getKey()+" has a total value of : $ "+Math.round(entry.getValue()*100)/100.0+"\n");
                }

            }

            return filter.toString();

} 

context: Два массива, которые я использовал (od и ord ) содержит объекты из двух SQL таблиц, и каждый объект, хранящийся в каждой из них, соответствует одной строке / кортежу из соответствующей таблицы. Таблица "orderdetails" содержит 5990 строк, поэтому массив "od" содержит 5590 элементов. Таблица «Заказы» содержит 650 строк, поэтому массив «ord» содержит 650 элементов. Когда я преждевременно завершаю циклы (настраивая итерацию так, чтобы она заканчивалась до последней записи массива), некоторые результаты, которые я ожидал, все же вышли. Просто когда я перебираю весь массив, я получаю исключение.

Сообщение об исключении, которое я получил от своей консоли, выглядит следующим образом:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2996, Size: 2996
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at com1028_coursework_sl01586.BaseQuery.filterOrder(BaseQuery.java:150)
    at com1028_coursework_sl01586.QueryTest.main(QueryTest.java:34)

В чем может быть проблема? Мои циклы или массив слишком велики?

1 Ответ

2 голосов
/ 03 мая 2020

size () дает вам значение, превышающее максимально допустимый индекс. Вы должны использовать <не <= в ваших условиях. Представьте себе список с одним элементом: размер равен 1, но в индексе 0 есть только один элемент, а в индексе 1 ничего нет. </p>

...