Java 为什么使用foreach时会出现StackOverflowerr错误?

Java 为什么使用foreach时会出现StackOverflowerr错误?,java,Java,我有这个界面: public interface ExpIterator extends Iterator<DNAChain> { void setLevel(int n); } 这门课: public class DNAChain { private String Chain; private boolean natural; public String getChain() { return Chain; }

我有这个界面:

public interface ExpIterator extends Iterator<DNAChain> {
    void setLevel(int n);
}
这门课:

public class DNAChain {
    private  String  Chain;
    private  boolean natural;

    public String getChain() {
        return Chain;
    }

    public  DNAChain (String  Chain, boolean natural) {
        this.Chain = Chain;
        this.natural = natural;
    }  
}
public class Experiment implements ExpIterator,Iterable{

    private DNAChain[] Chains; // Chains found in the experiment
    private int counter; // next  chain  index

    public DNAChain[] getChains() {
        return Chains;
    }

    public void setChains(DNAChain[] chains) {
        Chains = chains;
    }

    public  Experiment () {}

    public  Experiment (int  n) {
        Chains  = new DNAChain[n];
    }

    @Override
    public void setLevel(int n) {
    }

    @Override
    public boolean hasNext() {
        return counter < Chains.length;
    }

    @Override
    public DNAChain next() {
        return Chains[counter++];
    }

    @Override
    public void remove() {
    }

    @Override
    public Iterator iterator() {
      return this.iterator();
    }
}
我得到这个错误:

Exception in thread "main" java.lang.StackOverflowError
    at Experiment.iterator(Experiment.java:72)
    at Experiment.iterator(Experiment.java:72)
    at Experiment.iterator(Experiment.java:72)

我的代码怎么了?我做错了什么

您的方法experience.iterator正在无限递归中调用自己

如果您使用的是Java 8,则可以执行以下操作:

@Override
public Iterator iterator() { Arrays.stream(chains).iterator(); }

您需要在迭代器方法的实现中返回接口的实现。您还应该在类声明中指定迭代器的泛型类型

@Override
public Iterator<DNAChain> iterator()
{
    return new Iterator<DNAChain>()
    {
        @Override
        public boolean hasNext() { return false; }

        @Override
        public DNAChain next() { return null; }

    };
}
@覆盖
公共迭代器迭代器()
{
返回新的迭代器()
{
@凌驾
公共布尔hasNext(){return false;}
@凌驾
public DNAChain next(){return null;}
};
}
编辑:实际上,在您的例子中,您应该返回实验本身,因为它是实现迭代器的类。。。这太糟糕了!创建一个实现ExpIterator的内部类。此外,仅为提供信息,变量名称应按约定以小写字母开头(DNAChain[]链)

应该是这样的:

public class Experiment implements Iterable
{
    private DNAChain[] chains; // Chains found in the experiment
    private int counter; // next  chain  index

    public  Experiment () {}
    public  Experiment (int  n) { chains  = new DNAChain[n]; }

    public DNAChain[] getChains() { return chains; }
    public void setChains(DNAChain[] chains) { this.chains = chains; }

    public class ExpIteratorImpl implements ExpIterator
    {
        @Override
        public void setLevel(int n) { }

        @Override
        public boolean hasNext() { return counter < chains.length; }

        @Override
        public DNAChain next() { return chains[counter++]; }
    }

    @Override
    public Iterator iterator() { return new ExpIteratorImpl(); }
}
公共课堂实验实现Iterable
{
私有DNAChain[]链;//在实验中找到的链
私有int计数器;//下一个链索引
公共实验(){}
公共实验(int n){chains=new DNAChain[n];}
public DNAChain[]getChains(){return chains;}
public void setChains(DNAChain[]chains){this.chains=chains;}
公共类ExpIteratorImpl实现ExpIterator
{
@凌驾
公共void setLevel(int n){}
@凌驾
公共布尔值hasNext(){返回计数器

当你的实验完成后,检索迭代器来遍历你的DNA链。

返回这个。迭代器()-你认为这有什么作用?当然你在这里已经呆了足够长的时间,知道在问这样的问题之前,你真的应该做一次调试尝试。在这方面,这似乎是一连串被否决的低努力问题中的最新一个。我的理解是,这最终将导致被阻止,所以如果它继续下去更长的时间。迈克谢谢你的帖子。如何返回itertor链阵列?我必须自己实现它吗?我认为有几种方法,你可以查看另一篇文章并使用你更喜欢的选项。我喜欢这一个数组。stream(chains)。iterator();你能举一个简单的例子说明如何创建实现Exp迭代器的内部类吗?我只是坚持使用它。@Michael,我在我的文章中添加了一个例子。
public class Experiment implements Iterable
{
    private DNAChain[] chains; // Chains found in the experiment
    private int counter; // next  chain  index

    public  Experiment () {}
    public  Experiment (int  n) { chains  = new DNAChain[n]; }

    public DNAChain[] getChains() { return chains; }
    public void setChains(DNAChain[] chains) { this.chains = chains; }

    public class ExpIteratorImpl implements ExpIterator
    {
        @Override
        public void setLevel(int n) { }

        @Override
        public boolean hasNext() { return counter < chains.length; }

        @Override
        public DNAChain next() { return chains[counter++]; }
    }

    @Override
    public Iterator iterator() { return new ExpIteratorImpl(); }
}