简体   繁体   中英

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.

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

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

它也会调用这个 exeption,如果你在迭代器中向列表中添加了一些东西,然后在它之后不再调用it.next()而是删除该项目

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