【问题标题】:StackOverflowError when using Iterator to iterate through a list使用 Iterator 遍历列表时出现 StackOverflowError
【发布时间】:2018-03-06 23:24:07
【问题描述】:

我正在尝试在列表上实现 toArray() 方法。最初我收到一个错误,说我只能在使用 for each 循环时迭代数组或 java.lang.iterable 的实例,所以我做了一些研究并尝试使用迭代器。但是,现在它看起来像是陷入了递归循环(我认为)。这是我遇到问题的代码部分:

public Object[] toArray(){
    Object[] arr = new Object[this.size()]
    int i = 0;
    for(E e: this){
        arr[i] = e;
        i++;
    }
    return arr;
}

@Override
public Iterator<E> iterator() {
    return this.iterator();
}

我已将其范围缩小到我如何定义 public Iterator&lt;E&gt; iterator() 方法,因为如果我在 foreach 循环中使用其他值而不是 this,程序可以正常工作。我得到的错误是 Exception in thread "main"java.lang.StackOverflowError at arrayIndexList.ArrayIndexList.iterator(ArrayIndexList.java:158) 一遍又一遍地重复,但不是无限循环,因为它终止了。当我单击ArrayIndexList.java:158 时,它会将我带到我的代码中的return this.iterator()。我在这里错过了什么?

【问题讨论】:

  • public Iterator&lt;E&gt; iterator() { return this.iterator(); }???严重地。这不过是不受欢迎的递归。不要这样做。
  • 我认为“this”指的是在 toArray() 中的 for each 循环中正在查看的任何对象
  • 没有。这是指this,当前对象本身。删除该代码,而是返回类的集合或数组的迭代器。

标签: java iterator


【解决方案1】:

首先,您需要将Class&lt;E&gt; 传递给您的构造函数并保存它,以便您可以在toArray() 中正确构造您的数组类型 - 并返回一个E[]。然后你可以用List 包装它并返回iterator()。喜欢,

private Class<E> cls; // <-- make sure you assign this in your constructor

public E[] toArray() {
    E[] arr = Array.newInstance(cls, this.size()); // <-- here is how you get an E[]
    int i = 0;
    for (E e : this) {
        arr[i] = e;
        i++;
    }
    return arr;
}

@Override
public Iterator<E> iterator() {
    return Arrays.asList(this.toArray()).iterator();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2018-08-17
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    相关资源
    最近更新 更多