我正在研究一些代码,在测试过程中,它开始抛出一个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())。但是保存它,我不确定我在做什么是不合适的。
答案 0 :(得分:0)
我在代码中发现了这个错误。评论员是对的; updateTable()(间接)负责。这是一个特殊情况,某些主机将从全局字段中删除,而我的测试数据只是必须触及这种特殊情况。我没有删除这个问题,因为我相信我的具体错误有价值。简而言之,如果您获得ConcurrentModificationException
,请检查以下内容:
synchronize
循环)?