Reputation: 125
I'm trying to remove an object from a list using the list iterator. I've gone through the other solutions on the website and none have alleviated the error "Exception in thread "main" java.util.ConcurrentModificationException"
here is my code that is not executing :
void PatronReturn(String bookName) {
// get to beginning
while(listIterator.hasPrevious()) {
listIterator.previous();
}
while(listIterator.hasNext()){
Book b = listIterator.next();
if (listIterator.next().getBookTitle().equals(bookName)) {
//listIterator.next();
//listIterator.remove();
books.remove(b);
//listIterator.next(); //moves to next so iterator can remove previous ?
//books.remove(listIterator.next());; // TODO see if this is correct
}
}
Upvotes: 3
Views: 19972
Reputation: 4476
{ Book toBeReaplced = null; Book tempBook = null;
void PatronReturn(String bookName)
{// get to beginning
while(listIterator.hasPrevious()) { listIterator.previous();
}
while(listIterator.hasNext()){
Book tempBook = listIterator.next();
if (b.getBookTitle().equals(bookName)) {
toBeReaplced = tempBook;
}
listIterator.remove(bookToBeReplaced);
}
You can try the above code. I think it will able to solve your problem, that you have facing that java.util.ConcurrentModificationException" error. for more reference on the error please follow the link
Upvotes: 0
Reputation: 3718
instead of books.remove(b)
use
listIterator.remove();
the reason is, that the iterator gives you the next() book, if you only remove the book from books, the iterator has the "removed" book still as next book.
it did not work in your code, because you called .next() twice, once for the book b and a second time when comparing the book title, with the next book.
Upvotes: 5
Reputation: 69329
Do not remove an item from a list directly. Use the remove()
method in the iterator.
Your code is also flawed in that it assumes there are additional list items:
while(listIterator.hasNext()){
Book b = listIterator.next();
if (listIterator.next().getBookTitle().equals(bookName)) {
// eek
Here you call next()
twice, yet you've only called hasNext
once. Perhaps you meant:
while(listIterator.hasNext()){
Book b = listIterator.next();
if (b.getBookTitle().equals(bookName)) {
// ...
Finally, you can replace:
while(listIterator.hasPrevious()) {
listIterator.previous();
}
with
listIterator = books.listIterator();
Upvotes: 11
Reputation: 175
You cannot remove an item whilst iterating a list, you should use .remove()
Also remove this:
while(listIterator.hasPrevious()) {
listIterator.previous();
}
This is not neccesary
Upvotes: 0
Reputation: 17725
You can NOT remove an item from an ArrayList
while iterating.
you can either :
ListIterator
(at most once for each next())List
implementation, like CopyOnWriteArrayList, wich is garanteed never to throw an ConcurrentModificationException
, but this is probably overkill in your case.Upvotes: 0