使用迭代器[.next()]时出现ConcurrentModificationException错误

时间:2014-04-09 19:55:44

标签: java arraylist iterator concurrentmodification

我需要一些迭代器的帮助,看起来无论我做什么都不断给我错误:

Exception in thread "main" java.util.ConcurrentModificationException
 at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
 at java.util.ArrayList$Itr.next(ArrayList.java:831)
 at package.Dictionary.writer(Dictionary.java:72)
 at package.main.main(main.java:24) <5 internal calls>

我可以使用任何帮助来帮助解决这个问题,我对Java编程有些新意。我的完整代码如下:

package package;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.*;

public class Dictionary {
    Collection<String> webster = new ArrayList<String>();
    Iterator<String> iter = webster.iterator();
    File path = null;

    public Dictionary(Collection<String> words) {
        if (words == null) {
            throw new NullPointerException("Error: Collection NULL");
        } else {
            if (!words.isEmpty()) {
                clear();
            }
        }
    }

    public long load(File file) throws FileNotFoundException {
        String filePath = file.getAbsolutePath();
        if (file.getAbsolutePath().equals(null)
                || file.getAbsolutePath().equals("")) {
            throw new FileNotFoundException("Error: No File Found!");
        } else {
            if (file.exists()) {
                Scanner fileScanner = new Scanner(new File(filePath));
                long time = System.nanoTime();
                while (fileScanner.hasNext()) {
                    webster.add(fileScanner.next());
                }
                long time2 = System.nanoTime();
                long duration = time2 - time;
                return duration;
            } else {
                throw new FileNotFoundException("Error: No File Exsists!");
            }
        }
    }

    public boolean contains(String target) {
        if (webster.contains(target)) {
            return true;
        } else {
            return false;
        }
    }

    public void clear() {
        webster.clear();
    }

    public void writer() throws Exception {
        PrintWriter out = new PrintWriter("words.txt");
        while (iter.hasNext()) {
            out.println(iter.next());
        }
        out.close();
    }
}

2 个答案:

答案 0 :(得分:1)

您现在遇到的问题是因为您正在创建迭代器,然后通过加载字典来修改列表,然后使用迭代器(现在抛出异常,因为在创建迭代器后修改了列表)。 p>

您将Iterator作为实例变量,并在初始化时实例化它。你不想在这里这样做。而是在您使用它的方法中创建Iterator,例如摆脱实例变量并执行:

public void writer() throws Exception {
    PrintWriter out = new PrintWriter("words.txt");
    Iterator<String> iter = webster.iterator();
    while (iter.hasNext()) {
        out.println(iter.next());
    }
    out.close();
}

或者,甚至更清楚,并且不使用明确的Iterator,只需执行:

public void writer() throws Exception {
    PrintWriter out = new PrintWriter("words.txt");
    for (String entry : webster)
        out.println(entry);
    out.close();
}

迭代器只是一个临时对象,可以用于迭代一组项目,它不需要留下来。在需要时创建一个,然后在完成它时忘记它。

答案 1 :(得分:1)

在创建Collection之后但在完成迭代之前,您正在修改名为webster的{​​{1}}。这会导致Iterator

考虑到您在ConcurrentModificationException之前不需要进行迭代,只需在那里创建一个本地writer,这样就无法检测到修改

Iterator