为什么我得到以下简单代码剪切的Exception?

时间:2015-08-30 06:05:00

标签: java collections

我在使用addFirst()和addLast()方法后尝试显示此链表时遇到异常。

import java.util.List;

import java.util.LinkedList;

import java.util.Iterator;

public class File1 {

    public static void main(String ...args){

        LinkedList<Integer> list = new LinkedList<Integer>();
        list.add(1);
        list.add(20);
        list.add(30);       
        Iterator<Integer> iterator = list.iterator();

        while(iterator.hasNext())
            System.out.print(iterator.next() + " ");

        list.add(1,600);        
        System.out.println(list);       
        list.remove(1);
        System.out.println(list);

        System.out.println("now using linked list specific 2 methods...");

        list.addFirst(901);
        list.addLast(902);

            while(iterator.hasNext())   
            System.out.print(iterator.next()+" ");
             //this line throws Exception:

     } //end of main()
} //end of class

3 个答案:

答案 0 :(得分:1)

运行代码我得到ConcurrentModificationException

引用javadoc

  

此类的iteratorlistIterator方法返回的迭代器是 fail-fast :如果在创建迭代器后的任何时候对列表进行结构修改,则任何除了通过Iterator自己的removeadd方法之外,迭代器将抛出ConcurrentModificationException

第二个while循环使用第一个while循环中的迭代器,并且列表已经“结构修改”。即使你没有得到这个错误,第二个循环也行不通,因为迭代器已经在结束了。

在第二个循环之前添加以下内容:iterator = list.iterator();
或者更好的是使用for循环:for (Integer value : list)
或者甚至更好,只需像addremove之后那样打印列表。

答案 1 :(得分:0)

在第二次循环之前创建新的迭代器并打印它。 例如:        Iterator iterator1 = list.iterator();

答案 2 :(得分:0)

您可以使用以下代码。

    LinkedList<Integer> list = new LinkedList<Integer>();
    list.add(1);
    list.add(20);
    list.add(30);       
    Iterator<Integer> iterator = list.iterator();

    while(iterator.hasNext())
        System.out.print(iterator.next() + " ");

    list.add(1,600);        
    System.out.println(list);       
    list.remove(1);
    System.out.println(list);

    System.out.println("now using linked list specific 2 methods...");

    list.addFirst(901);
    list.addLast(902);
    Iterator<Integer> iterator1 = list.iterator();
     while(iterator1.hasNext())   
     System.out.print(iterator1.next()+" ");
         //this line throws Exception: