为啥我在使用 foreach 时会收到 ***Error?
Posted
技术标签:
【中文标题】为啥我在使用 foreach 时会收到 ***Error?【英文标题】:Why I get ***Error when I use foreach?为什么我在使用 foreach 时会收到 ***Error? 【发布时间】:2017-12-21 06:48:54 【问题描述】:我有这个界面:
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();
如您所见,Experiment 类实现了 Iterable 接口,因此我可以使用 foreach。
但是当我尝试在 Experiment 对象上使用 foreach 时:
Experiment experiment1 = new Experiment(5);
for (Object o :experiment1)
System.out.println("ddd");
((DNAChain)o).getChain();
我收到此错误:
Exception in thread "main" java.lang.***Error
at Experiment.iterator(Experiment.java:72)
at Experiment.iterator(Experiment.java:72)
at Experiment.iterator(Experiment.java:72)
我的代码有什么问题?我做错了什么?
【问题讨论】:
return this.iterator();
- 你认为这是做什么的?
当然,您在这里已经足够长的时间了,知道在在这里提出这样的问题之前您真的应该进行调试尝试。
在那个注释中,这似乎是一系列低效问题中的最新一个,这些问题都被否决了。我的理解是,如果持续时间更长,这最终会导致被 SO 屏蔽。
【参考方案1】:
您的方法 Experiment.iterator 在无限递归中调用自己。
如果您使用的是 Java 8,您可以这样做:
@Override
public Iterator iterator() Arrays.stream(chains).iterator();
【讨论】:
迈克感谢您的来信。如何返回迭代器链数组?我必须自己实现吗? 我认为有几种方法,您可以查看其他帖子并使用您更喜欢的选项***.com/questions/10335662/… 个人比较喜欢这个 Arrays.stream(chains).iterator();【参考方案2】:您需要在迭代器方法的实现中返回接口Iterator 的实现。您还应该在类声明中指定迭代器的泛型类型。
@Override
public Iterator<DNAChain> iterator()
return new Iterator<DNAChain>()
@Override
public boolean hasNext() return false;
@Override
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();
当您的实验完全设置后,检索迭代器以遍历您的 DNA 链。
【讨论】:
你能举一个简单的例子来说明如何创建实现 ExpIterator 的内部类吗? 我只是坚持下去。 @Michael,我在帖子中添加了一个示例。以上是关于为啥我在使用 foreach 时会收到 ***Error?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在尝试使用 HttpListener 时会收到“AccessDenied”? [复制]
为啥我在使用 RemoteFileTemplate 时会在日志中收到意外的 RuntimeException 警告?
为啥我在尝试使用 reddit API 时会收到 405 错误?