代码如下,为什么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上面
正确运行截图:remove()方法放在new it1下面
首先明确一点,这个报错的原始报错是数组越界,见源码:
每调用一次next
,it
中的坐标记录值就加一。在你19行的while
循环执行完时,it
中的指针坐标已经为数组的size对应的值了,即:如果你数组是5个元素,在你while走完时,it
中的坐标值已经是5了,但是请记住,数组下标是从0开始的,5个元素最大下标是4,这时候调用it.remove()
删除第5个元素就直接报数组越界异常了,接着被it
自己try catch住再抛出ConcurrentModificationException
异常。
而你新建的 it1
中的记录下标初始值是0
,自然是不会报错。