Java,报错,请问为什么it.remove()在不同位置,其中一个会报错

代码如下,为什么it.remove()在new it1前运行会报错


package opLinkedList;
import java.util.LinkedList;
import java.util.Iterator;
public class file1 {
    public void add()
    {
        LinkedList List=new LinkedList();//创建一个链表类对象List
        List.add("王鹏");
        List.add("王浩");
        List.add("王杰");
        List.add("张杰");
        List.add("李杰");
        List.add("孙文杰");
        List.add("赵杰");
        //通过迭代器遍历输出初始数据
        Iterator it=List.iterator();//创建一个迭代器对象it
        System.out.println("学生姓名如下:");
        while(it.hasNext())
        {
            System.out.println(it.next());
        }    
                //问题在这里
                //it.remove();//删除末尾的一个元素
        Iterator it1=List.iterator();//创建一个迭代器对象it1
        it.remove();//删除末尾的一个元素
        System.out.println();//换行
        System.out.println("删除一名学生后学生姓名如下:");
        for(int i=0;i<List.size();i++)
        {
            System.out.println(it1.next());
        }
    }
    
    public static void main(String[] args)
    {
        file1 f=new file1();
        f.add();
    }
}

报错截图:remove()方法放在new it1上面

img

正确运行截图:remove()方法放在new it1下面

img

img


Iterator迭代的时候可以移除数据,但是不能添加;而ListIterator迭代时可以添加数据,移除数据,倒序遍历;
添加或者移除是在迭代时进行的;
你再用一下listiterator 的迭代方式来试一下,看一下两者有什么区别....

可以看一下这篇文章


欢迎采纳

首先明确一点,这个报错的原始报错是数组越界,见源码:

img

每调用一次nextit中的坐标记录值就加一。在你19行的while循环执行完时,it中的指针坐标已经为数组的size对应的值了,即:如果你数组是5个元素,在你while走完时,it中的坐标值已经是5了,但是请记住,数组下标是从0开始的,5个元素最大下标是4,这时候调用it.remove()删除第5个元素就直接报数组越界异常了,接着被it自己try catch住再抛出ConcurrentModificationException异常。
而你新建的 it1 中的记录下标初始值是0,自然是不会报错。