打印向量的内容时出现ConcurrentModificationException

时间:2013-06-19 17:52:06

标签: java concurrentmodification

好的,所以我想编写一个允许用户输入无限数量的程序,然后再次以相同的顺序打印它们。

我收到此错误:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.Vector$Itr.checkForComodification(Unknown Source)
    at java.util.Vector$Itr.next(Unknown Source)
    at myPackage.Main.main(Main.java:41)

第41行是这行“System.out.println(itr.next());”一个

这是我的代码:

package myPackage;

import java.util.Scanner;
import java.util.Vector;
import java.lang.Integer;
import java.util.Iterator;

public class Main {

private static Scanner user_input;

public static void main(String[] args) {

    int first = 42;
    int second = 84;

    user_input = new Scanner(System.in);

    Vector<Integer> v = new Vector<Integer>();

    Iterator<Integer> itr = v.iterator();

    System.out.println("Please enter the numbers you wish to store temporarily before printing. When finished, enter either 42 or 84");

    int userInt = user_input.nextInt();

    while(user_input.equals(first) == false && user_input.equals(second) == false){

        userInt = user_input.nextInt();
        if(userInt == 42 || userInt == 84){
            break;
        }
        else{
          v.add(userInt);
        }
    }

        System.out.println("Iterating through Vector elements...");

        while(itr.hasNext()){
             System.out.println(itr.next());
        }

    System.out.println("The program has terminated");
}
}

我是否搞乱了迭代器?提前谢谢!

2 个答案:

答案 0 :(得分:3)

在您向Vector添加任何内容之前,您过早地创建了迭代器。移动这一行:

Iterator<Integer> itr = v.iterator();

在最后一次while循环中使用它之前:

Iterator<Integer> itr = v.iterator();
while(itr.hasNext()){

...完成修改Vector后。

您看到ConcurrentModificationException的原因是您在Vector存在时修改了Iterator

答案 1 :(得分:3)

请参阅JavaDoc,粗体是我的:

  

Vector的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建Iterator之后的任何时候对Vector进行结构修改,除了通过Iterator自己的remove或add方法之外,Iterator将抛出ConcurrentModificationException 。因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒任意,非确定性行为的风险。 Vector的元素方法返回的枚举不是快速失败的。

在您的情况下,您在创建后修改了向量,这在帖子中为您提供了例外。