Java自定义MyArrayList实现Iterator迭代器后for-each遍历报错问题
问题排查与修复方案
问题1:迭代器属性不符合要求、未关联实际列表实例
你当前MyArrayListIterator里的list属性声明为E[]类型,不符合要求的MyArrayList类型,且迭代器没有定义接收MyArrayList实例的构造方法。你在iterator()方法中创建迭代器时没有传入当前列表对象,导致迭代器内部的list永远为null,就算编译通过运行也会抛出空指针异常。问题2:上层接口未继承
Iterable导致增强for循环识别失败
你的主方法中变量声明为MyList<String> names,如果MyList接口没有继承Iterable<E>,哪怕子类MyArrayList单独实现了Iterable,用父接口MyList类型声明的变量也无法被识别为可迭代类型,就会抛出你遇到的类型不匹配报错。如果不想修改MyList接口,也可以直接将主方法的变量声明改为MyArrayList<String> names = new MyArrayList<>();临时解决。问题3:迭代器方法缺少必要校验
现有next()方法没有先判断是否还有剩余元素,直接访问索引会在遍历到末尾后调用时报数组越界异常;同时判断元素是否存在时不要直接用内部数组的长度,要取列表实际存储的元素个数(避免数组扩容预留的空位置影响判断)。
修正后的代码示例
- 修正
MyList接口
// 需继承Iterable<E>才能让所有实现类都支持增强for循环 public interface MyList<E> extends Iterable<E> { // 原有其他方法声明 void add(E element); E get(int index); int size(); }
- 修正
MyArrayListIterator类
import java.util.Iterator; import java.util.NoSuchElementException; class MyArrayListIterator<E> implements Iterator<E> { // 按要求改为MyArrayList类型的list属性 private MyArrayList<E> list = null; private int currentIndex = 0; // 新增带参构造方法接收列表实例 public MyArrayListIterator(MyArrayList<E> list) { this.list = list; } @Override public boolean hasNext() { return currentIndex < list.size(); } @Override public E next(){ if (!hasNext()) { throw new NoSuchElementException(); } return list.get(currentIndex++); } }
- 修正
MyArrayList中的iterator()方法
@Override public Iterator<E> iterator() { // 将当前列表实例传入迭代器 return new MyArrayListIterator<>(this); }
内容的提问来源于stack exchange,提问作者nrw2631
相关产品推荐
相关产品推荐

