You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()方法没有先判断是否还有剩余元素,直接访问索引会在遍历到末尾后调用时报数组越界异常;同时判断元素是否存在时不要直接用内部数组的长度,要取列表实际存储的元素个数(避免数组扩容预留的空位置影响判断)。


修正后的代码示例

  1. 修正MyList接口
// 需继承Iterable<E>才能让所有实现类都支持增强for循环
public interface MyList<E> extends Iterable<E> {
    // 原有其他方法声明
    void add(E element);
    E get(int index);
    int size();
}
  1. 修正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++);
    }
}
  1. 修正MyArrayList中的iterator()方法
@Override
public Iterator<E> iterator() {
    // 将当前列表实例传入迭代器
    return new MyArrayListIterator<>(this);
}

内容的提问来源于stack exchange,提问作者nrw2631

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:36:04