Iterator.remove()IllegalStateException

时间:2014-03-12 18:54:11

标签: java iterator illegalstateexception

在下面的代码中,我有一个try catch块,尝试使用Iterator从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。我不确定这意味着什么。

3 个答案:

答案 0 :(得分:27)

您尚未在next()上调用Iterator,因此它尚未引用第一项。您无法删除尚未指定的项目。

先呼叫next()前进到第一个项目,然后拨打remove()

答案 1 :(得分:1)

如果您将某些内容添加到迭代器中的列表中,然后又不调用它,则再次调用该next()而是删除该项。

答案 2 :(得分:0)

@rgettman的答案是正确的,但可以给您带来想象力。

我们的收藏:| el1 | | el2 | | el3 |

当您致电iterator.next()时,它的工作方式如下:

| el1 |迭代器| el2 | | el3 |

因此它跳过了该元素,并返回对被跳过的元素的引用(| el1 |)。因此,如果我们现在叫iterator.remove(),| el1 |将被删除。

值得添加上面提到的@PedroBarros -在两次iterator.remove()之间没有iterator.next()的情况下,您无法两次调用IllegalStateException,因为会抛出iterator1.next(); iterator1.remove(); iterator2.next(); 。 同样,当您创建两个迭代器(iterator1,iterator2)时,请调用:

iterator2

将抛出ConcurrentModificationException,因为import numpy as np import matplotlib.pyplot as plt # plots port counts per address as a stacked bar graph fig=plt.figure() ax=fig.add_subplot(111) text=ax.text(0,0, '', va='baseline', ha='left') # plot y=np.array([[1,2,3],[4,5,6]]) for i in range(2): ax.plot(y[i, :], gid=i) def on_click(event): for curve in ax.get_lines(): if curve.contains(event)[0]: gid=curve.get_gid() text.set_text('Class %s' % gid) fig.canvas.mpl_connect('button_press_event', on_click) 检查集合是否已修改。