Question

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);  
    }
Was it helpful?

Solution

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

OTHER TIPS

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;
      }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top