【问题标题】:ConcurrentModificationException in removing element in ArrayList [Using iterator.remove()]删除 ArrayList 中的元素时出现 ConcurrentModificationException [使用 iterator.remove()]
【发布时间】:2013-09-05 06:41:27
【问题描述】:

我知道我们不应该在迭代期间修改 ArrayList。

但是我使用 Iterator 来遍历 list 和 iterator.remove() 来删除元素,但仍然导致 ConcurrentModification Exception。

我的程序不是多线程的。

我有很多 arraylist [类包含它并且我正在处理许多对象数组]

for(int i=0;i<obj.length;i++)
{
    if(k==i) continue;

    it = obj[i].arraylist.iterator();

    while(it.hasNext()){
    value = it.next();

      if(condn)  {
       it.remove();
       obj[k].arraylist.add(value);
       //k and i are not same 

      }

    }

}

【问题讨论】:

  • 请提供完整的代码。
  • 你有堆栈跟踪吗?我觉得还可以。

标签: java exception arraylist concurrentmodification


【解决方案1】:

"请注意,Iterator.remove 是修改集合的唯一安全方法 在迭代期间;如果底层的行为是未指定的 在迭代中以任何其他方式修改集合 进步。”

您可以在迭代期间删除对象但不能添加新对象,这就是您得到 ConcurrentModificationException 的原因。

http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html

编辑: 您还可以查看:

if(k==i || obj[i].arraylist == obj[k].arraylist) continue;

【讨论】:

  • 即使他正在添加到另一个列表?注意“i”和“k”确保不一样。所以我假设 obj[i].arraylist 和 obj[k].arraylist 也不是同一个实例。
  • @Fildor 您确定 'i' 和 'k' 确实不同,但您不能假设 obj[i] 和 obj[k] 中的数组列表不是同一个对象。
  • 如果是这种情况,那么我们检测到了缺陷:) BTW:如果实例相同,它应该继续,所以,它应该是obj[i].arraylist == obj[k].arraylist),对吗?
【解决方案2】:

您只能在迭代期间使用it 变量修改列表。

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 2012-11-21
    • 2013-03-02
    • 2020-09-02
    • 1970-01-01
    • 2013-12-14
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多