首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >非多线程程序中的java.util.ConcurrentModificationException

非多线程程序中的java.util.ConcurrentModificationException
EN

Stack Overflow用户
提问于 2009-11-30 01:52:28
回答 4查看 20.8K关注 0票数 15

嘿,所以Guru's im有一个关于这个代码的工作

代码语言:javascript
复制
public void kill(double GrowthRate, int Death)
{
    int before = population.size();
    for (PopulationMember p : population)
    {
        int[] probs = ProbablityArrayDeath(GrowthRate,Death,(int)p.fitness());
        if (probs[RandomNumberGen.nextRandomInt(0, 99)]==0)
        {
            population.remove(p);
        }
    }
    System.out.println("Intial Population: "+before+", Deaths:"+(before-          population.size())+", New Population: "+population.size());
}

当我运行我的程序时,当它第一次尝试运行代码时,它遇到以下错误

代码语言:javascript
复制
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
    at java.util.HashMap$KeyIterator.next(HashMap.java:828)
    at Genetics.Population.kill(Population.java:181)
    at Genetics.Population.run(Population.java:47)
    at Control.Main.main(Main.java:35)

仔细查看了一下,这似乎是线程尝试并发访问相同资源时通常会发生的错误,但这就是为什么我在这个系统中根本不是多线程的原因。

有没有人能解释一下为什么会发生这种情况,或者想个办法绕过它?

非常感谢^_^

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-30 01:56:15

您可以修改Iterator的底层Collection (隐藏在for-each循环中)。正确的方法是:

代码语言:javascript
复制
for (Iterator<PopulationMember> it = population.iterator(); it.hasNext();) {
    PopulationMemeber p = it.next();
    int[] probs = ProbablityArrayDeath(GrowthRate,Death,(int)p.fitness());
    if (probs[RandomNumberGen.nextRandomInt(0, 99)] == 0) {
        it.remove();
    }
}
票数 41
EN

Stack Overflow用户

发布于 2009-11-30 01:53:44

如果从集合中删除内容,则不能使用for each循环。

您必须使用Iterator并删除名为Iterator.remove的当前项。

否则,for-each循环在幕后为您创建的底层迭代器不会理解它所经历的集合是如何改变的,它会在您迭代它时告诉您它正在改变。

票数 12
EN

Stack Overflow用户

发布于 2009-11-30 01:54:32

在for循环下有一个隐藏在population上的迭代器。在迭代器工作的过程中,您正在从population中删除一项。迭代器无法继续工作,因为您在迭代过程中更改了集合。

它与多线程无关。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1816196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档