2017-07-16 87 views
-3

我有這個接口:當我使用forech時,爲什麼會出現StackOverflowError?

public interface ExpIterator extends Iterator {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(); 
    } 
} 

,你可以看到實驗類實現了Iterable inteface這樣我就可以使用的foreach。

,但是當我嘗試實驗對象使用的foreach:

 Experiment experiment1 = new Experiment(5); 

    for (Object o :experiment1) { 
      System.out.println("ddd"); 
     ((DNAChain)o).getChain(); 
     } 

我得到這個錯誤:

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) 

什麼是錯我的代碼做什麼錯?

+5

'return this.iterator();' - 你怎麼想的? –

+3

當然,在這裏問你這樣的問題之前,你已經在這裏足夠長的時間知道你應該進行調試了。 –

+0

在這個筆記上,它似乎是一系列低效努力中的最新成果,這些問題都被低估。我的理解是,如果持續時間更長,這最終會導致被阻止。 –

回答

1

您需要在您的實現迭代方法的返回接口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鏈。

+0

你能舉個簡單的例子來說明如何創建實現ExpIterator的內部類? – Michael

+0

我只是堅持下去。 – Michael

+0

@Michael,我在我的文章中添加了一個例子。 – Maaaatt

3

您的方法Experiment.iterator自我調用無限遞歸。

如果您使用的是Java 8,你可以這樣做:

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

邁克感謝發佈。我怎麼能返回itertor鏈數組?我必須自己實施嗎? – Michael

+0

我認爲有幾種方法,你可以檢查這個其他帖子,並使用你喜歡的選項更多https://stackoverflow.com/questions/10335662/convert-java-array-to-iterable – Mikel

+0

親自我喜歡這個陣列。流(鏈).iterator(); – Mikel

相關問題