*修改ArrayList后的ConcurrentModificationException *

时间:2014-08-04 20:43:22

标签: java exception arraylist

我正在研究一些代码,在测试过程中,它开始抛出一个ConcurrentModificationException。经过一些研究,让我感到困惑的是,我在迭代时不会在列表中添加或删除。我会迭代列表,但是在我添加到列表之后。为了增加清晰度,下面是代码的注释版本:

        File f = fc.getSelectedFile();
        ConfigurationManager manager = new ConfigurationManager(f);
        //The next line uses the same thread to get all Host objects from the file
        ArrayList<Host> configHosts = manager.getAllHosts();
        //Add the found hosts to a (previously established) ArrayList
        hosts.addAll(configHosts);
        for(Host h : hosts) { //Exception thrown points to this line.
            //This reads values from the Host object and puts them in a JTable.
            //No modification is done to the object, it is just read from.
            this.updateTable(h);
        }

我不确定此代码如何可能抛出ConcurrentModificationException,除非addAll()在另一个线程中运行(然后在仍然添加主机时调用updateTable())。但是保存它,我不确定我在做什么是不合适的。

1 个答案:

答案 0 :(得分:0)

我在代码中发现了这个错误。评论员是对的; updateTable()(间接)负责。这是一个特殊情况,某些主机将从全局字段中删除,而我的测试数据只是必须触及这种特殊情况。我没有删除这个问题,因为我相信我的具体错误有价值。简而言之,如果您获得ConcurrentModificationException,请检查以下内容:

  • 您是否尝试在迭代列表时从ArrayList中删除/添加项目?
  • 您是否确定正在读取ArrayList副作用的代码是免费的(即它在任何情况下都不会修改列表)(这是我的问题)?
  • 您是否在多线程环境中工作,在迭代期间可以修改此ArrayList(如果是,您可能希望synchronize循环)?