背景知识:
java中foreach的语法格式如下
for(数据类型 标识符 in 表达式)
{
循环体
}
foreach在java中的实现方式时构造一个迭代器来进行这个操作
比如一个
List<Object> L1=new ArrayList <>();
for(Object o:L1){
循环体
}
本质上的实现方式就是:
for (Object L2 = ((List)L1).iterator(); ((Iterator)L2).hasNext(); )
{
循环体
}
问题引入:
在lab2中的ConcreteVerticesGraph类中,有一个方法,删除指定的元素,在实现这个方法时我首先想到了采用foreach循环来解决这个问题:
@Override public boolean remove(L vertex) {
boolean exist = false;
for(Vertex<L> a:vertices) {
if(a.equals(new Vertex<>(vertex)))
{
vertices.remove(new Vertex<>(vertex));
exist=true;
}
else
a.getTargets().remove(vertex);
}
checkRep();
return exist;
}
在循环中如果当前元素是这个要删除的元素那么就删除并且记录删除结果为成功(True)
如果不是,就在当前元素指向的点组成的集合中删除这个元素,运行测试用例时发现:
出现了这个异常:java.util.ConcurrentModificationException
我们根据foreach的实现方式知道,这里是使用了迭代器在操作的时候出现了异常,那么异常具体是怎么产生的呢?