[英]Iterator.remove() IllegalStateException
在下面的代码中,我有一个 try catch 块,它尝试使用迭代器从 Vector 中删除一个元素。 我创建了自己的类QueueExtendingVect
来扩展Vector
并实现Iterator
。
变量qev1
是QueueExtendingVect
类的一个实例。 我也已经向这个 Vector 添加了一些元素。
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));
}
}
在这段代码中,我向 Vector qev1 添加了一些元素。 其他变量位于代码的其他部分。
但是,当我运行我的程序时,我在运行时收到了 IllegalStateException。 我不确定这意味着什么。
您尚未在Iterator
上调用next()
,因此它尚未指代第一项。 您无法删除尚未指定的项目。
先调用next()
以前进到第一项,然后调用remove()
。
@rgettman 答案是正确的,但要给您想象力。
我们的收藏:|el1| |el2| |el3|
当您调用iterator.next()
它的工作方式如下:
|el1| 迭代器 |el2| |el3|
所以它跳过元素并返回对被跳转元素的引用(|el1|)。 所以如果我们现在调用iterator.remove()
,|el1| 将被删除。
这是值得添加什么@PedroBarros上面提到的-你不能叫iterator.remove()
两次没有iterator.next()
他们之间因为IllegalStateException
会被抛出。 同样,当您创建两个迭代器(iterator1、iterator2)然后调用:
iterator1.next();
iterator1.remove();
iterator2.next();
将抛出 ConcurrentModificationException 因为iterator2
检查集合已被修改。
它也会调用这个 exeption,如果你在迭代器中向列表中添加了一些东西,然后在它之后不再调用it.next()
而是删除该项目
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.