2015-07-04 2 views
-2

Вопрос: Почему я получаю ошибку IndexoutOfBound?java.lang.indexOutOfBound с использованием arraylist

Справочная информация: Я пишу приложение для магазина. Использование List ArrayList для хранения всех элементов, переданных через CSV-файл. Я написал продукт obj, и он заполняется правильно. Я использую корзину obj, которую я написал для итерации, хотя этот список продуктов выполняет добавление и удаление методов на отдельной корзине ArrayList. По какой-то причине я получаю ошибку java.lang.IndexOutOfBound при сопоставлении ввода пользователя с атрибутом name моего объекта продукта. Для этого я использую метод .equals из класса string.

Код ниже: Это мой собственный метод adAdd для моего объекта. Он заставляет пользователя вводить строку, а затем использует это, чтобы найти определенный элемент в моем списке, чтобы выполнить добавление в мой местный список корзины. Он также удаляет этот элемент из исходного списка.

private boolean performAdd(Inventory inventory){ 

     // return value 
     boolean success = false; 

     Scanner in = new Scanner(System.in); 

     System.out.println("Please provide the name of the item you would like to add to the cart"); 
     String temp = in.nextLine(); 

     System.out.println(temp); 

     Iterator itr = inventory.productList.iterator(); 

     // empty product object using default 
     Product prod = new Product(); 

     int i = 0; // index values for grabbing objects from the inventory list 

     // looping through the array list of our inventory of items 
     while (itr.hasNext()){ 

      // check to see which product has the same name as what the user said 
      if (temp.equals(inventory.productList.get(i).getName())){ 

       prod = inventory.productList.get(i); // grab the product object from inventory list and assign empty product object 

       inventory.productList.remove(i); // remove this object from the inventory list 

       addToCart(prod); // call to in class method for cart 

       success = true; // change boolean return value 
       } 

      i++; // increment index 
     } 
     return success; 
    } 
+0

Вы уверены, что на товарном листе на самом деле есть элементы для итерации? Попробуйте распечатать все элементы, чтобы подтвердить это. –

ответ

0

Вы не используете Итератор правильно. Вместо использования get(i) используйте функцию .next(), которую предоставляет Iterator.

Что ваш код в настоящее время делает это:

Check has next; <-- always true as long as there is 1 item because your iterator is always in position 0 

There is at least 1 Therefore it's true. 

// stuff 

Increment i 

Go to top. 

Вместо этого вам необходимо обновить позицию итератора, который функция .next() делает.

Кроме того, используйте встроенный remove() метода итератора, чтобы избежать ConcurrentModificationException

1

Есть две проблемы с вашим кодом:

  1. Не смешивайте итераторы и индексации. Если вы выполняете цикл с помощью итератора, используйте iterator.next() для доступа к текущему элементу вместо get(i). В противном случае итератор не будет обновляться, и iterator.hasNext() всегда будет возвращать true (пока в списке есть хотя бы один элемент). Это вызывает IndexOutOfBoundsException.
  2. Не используйте List.remove, итерации по списку. В общем, вам не разрешается изменять список, итерации по нему. (В противном случае будет выброшено ConcurrentModificationException.) Вместо этого используйте iterator.remove().
Смежные вопросы