Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Iterator.remove() IllegalStateException

In the code below I have a try catch block that attempts to remove an element from a Vector, using Iterator. I've created my own class QueueExtendingVect that extends Vector and implements Iterator.

The variable qev1 is an instance of class QueueExtendingVect. I've already added a few elements to this Vector as well.

try 
{
   qev1.iterator().remove();
}
catch(UnsupportedOperationException e) 
{
   System.out.println("Calling Iterator.remove() and throwing exception.");
}

qev1.enqueue(ci); 
qev2.enqueue(ci);
qcv1.enqueue(ci);
qcv2.enqueue(ci);

for (int i = 1; i < 5; i++)
{
   if (i % 2 == 0)
   {
       qev1.enqueue(new CInteger(i+1));
       qev2.enqueue(new CInteger(i+1));
       qcv1.enqueue(new CInteger(i+1));
       qcv2.enqueue(new CInteger(i+1));
   } 
   else 
  { 
       qev1.enqueue(new Date(i*i));
       qev2.enqueue(new Date(i*i));
       qcv1.enqueue(new Date(i*i));
       qcv2.enqueue(new Date(i*i));
   }
}

In this code I add a few elements to the Vector qev1. The other variables are in other parts of the code.

However, when I run my program I get an IllegalStateException at runtime. I'm not sure what this means.

like image 661
Delfino Avatar asked Mar 12 '14 18:03

Delfino


People also ask

How to remove value from Iterator?

An element can be removed from a Collection using the Iterator method remove(). This method removes the current element in the Collection. If the remove() method is not preceded by the next() method, then the exception IllegalStateException is thrown.

How Iterator remove works in Java?

The Iterator object is used to iterate over the elements of the list using the hasNext() and next() methods. An if the condition is used within the while loop and when the condition is satisfied, the particular element is removed using the remove() method.

How do I uninstall Java Lang IllegalStateException?

How to Fix IllegalStateException. To avoid the IllegalStateException in Java, it should be ensured that any method in code is not called at an illegal or inappropriate time. Calling the next() method moves the Iterator position to the next element.


2 Answers

You haven't called next() on your Iterator, so it's not referring to the first item yet. You can't remove the item that isn't specified yet.

Call next() to advance to the first item first, then call remove().

like image 125
rgettman Avatar answered Oct 15 '22 10:10

rgettman


@rgettman answer is correct but to give you imagination.

Our collection: |el1| |el2| |el3|

when you call iterator.next() it works this way:

|el1| iterator |el2| |el3|

so it jumps over the element and return reference to the element which was jumped (|el1|). So if we called iterator.remove() now, |el1| would be removed.

It's worth to add what @PedroBarros mentioned above - you can't call iterator.remove() two times without iterator.next() between them because IllegalStateException would be thrown. Also when you create two iterators (iterator1, iterator2) then calling:

iterator1.next();
iterator1.remove();
iterator2.next();

will throw ConcurrentModificationException because iterator2 checks that collection was modified.

like image 26
Michu93 Avatar answered Oct 15 '22 10:10

Michu93