概述
问题原因
使用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。
最后
以上就是深情大碗为你收集整理的Iterator迭代器报错:NoSuchElementException的全部内容,希望文章能够帮你解决Iterator迭代器报错:NoSuchElementException所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复