簡體   English   中英

For-Loop和LinkedList的索引錯誤

[英]Index Error with a For-Loop and a LinkedList

我正在嘗試自己制作一個小游戲以適應Java,我只是遇到了LinkedList Index的問題。 我找到了解決問題的方法,但我仍然不明白為什么我的第一個解決方案無效。 這段代碼:

        for (int i=0; i <= PlanetList.size(); i++)
        {
            g.drawImage(PlanetList.get(i).planetImage, PlanetList.get(i).xPos, PlanetList.get(i).yPos);
        }

給了我一個java.lang.IndexOutOfBoundsException,但是這段代碼:

            for (int i=1; i <= PlanetList.size(); i++)
        {
            g.drawImage(PlanetList.get(i-1).planetImage, PlanetList.get(i-1).xPos, PlanetList.get(i-1).yPos);
        }

事情是......我的索引在兩種情況下從0開始。 為什么第一個給我一個錯誤?

第一個示例中的最后一個索引超出了允許的索引范圍。 例如,如果列表的大小是10,則允許的索引范圍是[0 9]。 在第一個循環中,它最多為10( i <= PlanetList.size() )。 將終端條件更改為i < PlanetList.size()以修復您的問題。

替代方法是不使用索引來訪問列表中的元素,如@GhostCat建議的那樣:

for (Planet planet : PlanetList) {
    g.drawImage(planet.planetImage, planet.xPos, planet.yPos);
}

這稱為Java中的每個循環

另一種解決方案是簡單地使用無索引版本來迭代多年前引入的“集合”:

for (Planet planet : PlanetList) {
  g.drawImage(planet.planetImage, planet.xPos, planet.yPos);

作為一個很好的副作用,這也消除了你的示例中的代碼重復。

雖然我們在這里:你在某種程度上違反了“告訴不要問”的原則。 含義:您要求您的星球物體提供繪制它所需的所有細節。 在良好的面向對象設計中,您可以避免這種情況。 相反,你告訴對象做某事。 換句話說:你可以改變你的星球類

 public void drawWith(Graphics g) { ...

有了這個,上面的代碼可以重寫為:

for (Planet planet : ... ) { 
  planet.drawWith(g);

您正在獲得Out of bounds錯誤,因為我在for循環中聲明的變量運行的時間小於等於planetlist大小的條件,因為我從零開始它將一直到鏈表大小,但是因為你給出了小於等於它再循環進入循環因此超出范圍異常。將for循環條件更改為i小於鏈表大小它將工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM