当前位置: 首页 > 面试题库 >

为什么一个循环抛出ConcurrentModificationException,而另一个则没有抛出?

燕志学
2023-03-14
问题内容

我在编写Traveling Salesman程序时遇到了这个问题。对于内部循环,我尝试了

for(Point x:ArrayList<Point>) {
// modify the iterator
}

但是在该列表中添加另一个点时会导致ConcurrentModicationException被抛出。

但是,当我将循环更改为

for(int x=0; x<ArrayList<Point>.size(); x++) {
// modify the array
}

循环运行良好,没有引发异常。

这两个都是for循环,那么为什么一个抛出异常却另一个没有抛出异常呢?


问题答案:

正如其他人解释的那样,迭代器检测到对基础集合的修改,这是一件好事,因为它可能会导致意外的行为。

想象一下下面的无迭代器代码可以修改集合:

for (int x = 0; list.size(); x++)
{
  obj = list.get(x);
  if (obj.isExpired())
  {
    list.remove(obj);
    // Oops! list.get(x) now points to some other object so if I 
    // increase x again before checking that object I will have 
    // skipped one item in the list
  }
}


 类似资料:
  • 我试图将两个“Employee”对象添加到树集中: 但它引发了一个ClassCastException: 但是如果我只向TreeSet添加一个对象: 或者如果我使用哈希集: 那么它就是成功的。为什么会发生异常,如何修复它?

  • 这是Google Guice调用代码: 这是个例外: 我的问题是消息没有告诉我缺少哪一个特定的方法。有没有好的方法来调试这个?这可能是一个Maven传递依赖问题吗?

  • 问题内容: ConcurrentModificationException:当不允许对对象进行并发修改时,检测到该对象的并发修改的方法可能会抛出此异常。 上面是javadoc中的ConcurrentModificationException定义。 所以我尝试测试以下代码: 代码很简单。10个线程从arraylist对象中删除该元素。确保多个线程访问一个对象。但它运行正常。没有异常被抛出。为什么?

  • 本文向大家介绍为什么JavaScript的“ var null”抛出错误而“ var undefined”没有抛出错误?,包括了为什么JavaScript的“ var null”抛出错误而“ var undefined”没有抛出错误?的使用技巧和注意事项,需要的朋友参考一下 Web浏览器会抛出“ var null”错误,因为它是保留的标识符。 您不能在ECMAScript中使用以下文字作为标识符-

  • 我有两个反应组件Post和Postform。Posts是显示从api获取的帖子列表的组件。Postform组件是一种创建新帖子,然后更新帖子组件的表单。我在Posts中声明了一个函数addPost()为全局函数,并将其绑定在Posts构造函数中。然后,addPost()方法从Posts导出,并导入到Postform组件中,在那里我想使用导入的addPost()方法更新Posts组件的状态 但是,我

  • 我正在尝试使用Cython来加速我的Python脚本的某些部分。一个关键部分将函数应用于Pandas数据框架;由于这已经完成了很多次,我想用Cython编写这些函数以加快计算速度。函数如下,并且在同一个Jupyter笔记本单元格中: 笔记本单元按编写的方式成功运行,因此我认为两个函数都编译成功。但是,此代码按预期运行: 鉴于本规范: 不运行,并返回"NameError: name'evenness