Java concurrentModificationException

Java concurrentModificationException,java,exception,collections,concurrentmodification,Java,Exception,Collections,Concurrentmodification,在下面的代码片段中,我试图处理一个电子表格,但需要排除特殊的列。我知道我做这件事的粗糙方式,将异常放在ArrayList中,然后处理当前行列上的每一个增量上的列表是不正当的,但是你知道只要完成它就行了 然而,我得到了标题错误,我相信这永远不会发生。我只是循环遍历ArrayList并进行比较,没有修改任何内容。错误在哪里?有没有更好的方法来处理例外列表 ArrayList noProcess = new ArrayList(); Iterator itr00 = noProcess.iterato

在下面的代码片段中,我试图处理一个电子表格,但需要排除特殊的列。我知道我做这件事的粗糙方式,将异常放在ArrayList中,然后处理当前行列上的每一个增量上的列表是不正当的,但是你知道只要完成它就行了

然而,我得到了标题错误,我相信这永远不会发生。我只是循环遍历ArrayList并进行比较,没有修改任何内容。错误在哪里?有没有更好的方法来处理例外列表

ArrayList noProcess = new ArrayList();
Iterator itr00 = noProcess.iterator();
Iterator itr01 = noProcess.iterator();
noProcess.add(new Integer("5"));
noProcess.add(new Integer("18"));
....
 boolean include=true;
  for(int i=0;i<archive.length;i++){
    for (int j = 0; j < archive[i].length; j++) {
      while (itr00.hasNext()) {
        if (j == ( (Integer) itr00.next()).intValue())
          include = false;
      }
      if (include) {...

在Iterable上创建迭代器后,除了通过迭代器之外,您不能更改Iterable的内容,否则,移动迭代器后,您将获得ConcurrentModificationException-您创建了迭代器,然后执行noProcess.addnew Integer5;,然后,稍后推进迭代器


另外,您创建了两个迭代器-您也不应该这样做-这太疯狂了。

一旦您在Iterable上创建了迭代器,您就不能改变它的内容,而只能通过迭代器,否则一旦您移动了迭代器,您就会得到ConcurrentModificationException-您创建了一个迭代器,然后执行noProcess.addnew Integer5;,然后,稍后推进迭代器

另外,您创建了两个迭代器-您也不应该这样做-这太疯狂了。

:此例外情况可能是 由检测到对的并发修改的方法引发 当不允许进行此类修改时

例如,通常不允许一个线程在另一个线程迭代集合时修改集合

:此例外情况可能是 由检测到对的并发修改的方法引发 当不允许进行此类修改时


例如,通常不允许一个线程在另一个线程迭代集合时修改集合

在获取迭代器后在列表中添加记录,请更正该问题。。然后它应该可以工作。

在获得迭代器后在列表中添加记录,请更正该问题。。然后它应该可以工作。

来自Java文档:

此类的迭代器和listIterator返回的迭代器 方法是快速失败的:如果列表在任何时候进行了结构修改 创建迭代器后的时间,以任何方式,除了通过 迭代器自己的remove或add方法,迭代器将抛出 ConcurrentModificationException。因此,面对同时发生的冲突, 修改后,迭代器会快速、干净地失败,而不是 在不确定的时间冒任意、不确定行为的风险 将来

使用迭代器的add方法将Java文档中的元素添加到列表中:

此类的迭代器和listIterator返回的迭代器 方法是快速失败的:如果列表在任何时候进行了结构修改 创建迭代器后的时间,以任何方式,除了通过 迭代器自己的remove或add方法,迭代器将抛出 ConcurrentModificationException。因此,面对同时发生的冲突, 修改后,迭代器会快速、干净地失败,而不是 在不确定的时间冒任意、不确定行为的风险 将来


使用迭代器的添加方法将元素添加到列表

中,请标记为你正在使用的语言或系统。假设java是基于先前提出的问题。@柯林:对我来说,就像java,所以我添加了标签。你应该考虑使用每个语法。这是Java 5中添加的一个更漂亮的特性。可能的复制标记是用来指示你正在使用的语言或系统。我假设它是基于前面提出的问题的java。@柯林:java看起来像java,所以我添加了标签。你应该考虑使用每个语法。这是Java 5中添加的一个更好的功能。如果使用迭代器的add方法,那么迭代器的光标会自动更新。啊哈,是的-我应该解释一下,当我说更改时,我的意思是不是通过迭代器。答案已编辑…抱歉,我真的知道,只是太老花了,看不到简单的语法问题。然而,由于这种清晰,它更加模糊。在循环和比较中使用log4j语句,我得到了预期的一半。对于异常列表中的每个项目,我在每次运行时都会看到第一个诊断两次,但在比较时从未看到它,因此include始终为true。这是一个简单的比较为什么,他抱怨道。如果你使用迭代器的add方法,那么迭代器的光标会自动更新。啊,是的-我应该解释一下,当我说更改时,我的意思是不是通过迭代器。答案已编辑…抱歉,我真的知道,只是太老花了,看不到简单的语法问题。然而,由于这种清晰,它更加模糊。在循环和comparis中立即使用log4j语句 对了,我得到了我期望的一半。对于异常列表中的每个项目,我在每次运行时都会看到第一个诊断两次,但在比较时从未看到它,因此include始终为true。他抱怨道,这是一个简单的比较。