我是靠谱客的博主 深情大碗,最近开发中收集的这篇文章主要介绍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迭代器报错:NoSuchElementException所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部