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。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值