Pregunta

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.

¿Fue útil?

Solución

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().

Otros consejos

@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.

It will also call this exeption, If you add something to the list in iterator and then after it not calling it.next() again but removing the item

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top