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.