0

I have this method that removes a specific Object P from the ArrayList

here is my code:

public void removeProduct(Product p) throws StockException{
        int flag=0;
        for(Product i:StockProducts)
            if(p.getCode()==i.getCode()){
                this.StockProducts.remove(p);
                flag=1;
            }

        if(flag==0){
                StockException e = new StockException("could not remove the Product , PRODUCT IS NOT IN THE STOCK:  ", p);
        throw e;
          }
    }

Error :

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
    at Stock.removeProduct(Stock.java:29)
    at Test.main(Test.java:18)

If you need further information about my code tell me

ADDING METHOD

public void addProduct(Product p) throws StockException{
        for(Product i:StockProducts)
            if(p.getCode()==i.getCode()){
                        StockException e = new StockException("could not add the Product , CODE ALREADY EXIST IN STOCK: ", p);
                throw e;
                    }

                    this.StockProducts.add(p);  
    }
10
  • 2
    You can't alter a List in loops or using iterator.. Instead check if your list "contains" the object , if yes, remove it and set the flag. Commented Jan 20, 2014 at 11:44
  • You are getting that error because you are reading the arraylist and at the same time you are deleting the item from the list. Using iterator, You can not perform both operation simultaneously. Commented Jan 20, 2014 at 11:44
  • I dont get it , I've done the same thing with "addProduct" method and it worked Commented Jan 20, 2014 at 11:45
  • You CANNOT change the structure of the list while reading it using iterator or a loop. Show us your addProduct code. Commented Jan 20, 2014 at 11:46
  • User an Iterator instead and move around the ArrayList using Iterator.next(). To remove an object use Iterator.remove() Commented Jan 20, 2014 at 11:46

2 Answers 2

5

You are deleting an object from the ArrayList while trying to iterate through it. As others have pointed out to you, this doesn't work and is giving you the ConcurrentModificationException. You want something like this:

if(StockProducts.contains(p))
   StockProducts.remove(p);

Alternatively, if you really want to iterate through the list and change it, you should be able to use a ListIterator like this:

ListIterator<Product> iter = StockProducts.listIterator();
while(iter.hasNext()){
    if(iter.next().equals(p)){
        iter.remove(p);
    }
}

or if the list can have multiple Products with the same result from getCode():

ListIterator<Product> iter = StockProducts.listIterator();
while(iter.hasNext()){
    if(iter.next().getCode() == p.getCode()){
        iter.remove(p);
    }
}
Sign up to request clarification or add additional context in comments.

Comments

2

Use Iterator to remove the object from the list while iterating.

Do like this

Iterator<Product> iterator = StockProducts.iterator();
while(iterator.hasNext()) {
      Product i = iterator.next();
      if(p.getCode()==i.getCode()){
           iterator.remove();
           flag=1;
      }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.