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(); }
}