问题原因
使用Iterator迭代器循环遍历List时,在一次while循环中,连续多次调用next方法获取元素进行判断。因为next会让迭代器中的下标进行加1,然后在比对长度时,下标超出了List长度,抛出了NoSuchElementException异常。
例如:
List<String> list = new ArrayList<>();
list.add("11");
list.add("2");
list.add("13");
list.add("14");
list.add("15");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
if (iterator.next().contains("1") && !iterator.next().contains("2")){
System.out.println("1*");
}
}
第一次遍历,cursor下标等于2
第二次遍历,cursor下标等于4
第三次遍历的时候,第一次next调用后,cursor下标为5。第二次调用next,在next判断中,下标等于长度,所以手动抛出NoSuchElementException
解决方法
在迭代器的一次循环遍历中,只能调用一次next方法。
修改后:
List<String> list = new ArrayList<>();
list.add("11");
list.add("2");
list.add("13");
list.add("14");
list.add("15");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String next = iterator.next();
if (next.contains("1") && !next.contains("2")){
System.out.println("1*");
}
}
关联源码
List接口的迭代器
AbstractList接口的迭代器
AbstractList接口的迭代器的new Itr()方法,初始化迭代器参数。
实际ArrayList迭代器的next方法,可以看到在每调用一次next方法都会对下标进行判断,并且使迭代器的下标加1。