我是靠谱客的博主 深情大碗,这篇文章主要介绍Iterator迭代器报错:NoSuchElementException,现在分享给大家,希望可以做个参考。

问题原因

使用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迭代器报错内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(122)

评论列表共有 0 条评论

立即
投稿
返回
顶部