简体   繁体   中英

Error in removing object from ArrayList in Java [Eclipse]

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

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 Product s with the same result from getCode() :

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM