For-Loop和LinkedList的索引错误

时间:2016-07-24 04:21:50

标签: java indexing linked-list indexoutofboundsexception

我正在尝试自己创建一个小游戏以适应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开始。为什么第一个给我一个错误?

3 个答案:

答案 0 :(得分:5)

第一个示例中的最后一个索引超出了允许的索引范围。例如,如果列表的大小是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-each loop

答案 1 :(得分:3)

另一种解决方案是简单地使用无索引版本来迭代&#34;集合&#34;多年前推出的:

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

作为一个很好的副作用,这也消除了你的例子中的代码重复。

虽然我们在这里:你在某种程度上违反了&#34;告诉不要问&#34;原理。含义:您要求您的行星对象提供绘制它所需的所有细节。在良好的面向对象设计中,您可以避免这种情况。相反,您告诉对象做某事。换句话说:你可以将你的星球类改为

 public void drawWith(Graphics g) { ...

由此可以将上述代码重写为:

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

答案 2 :(得分:0)

你得到了Out of bounds错误,因为我在for循环中声明的变量运行的时间小于等于planetlist大小的条件,因为我从零开始它将一直到链表大小但是因为你给了更少比等于它再循环一次因此超出范围异常。将for循环条件改为i小于链表大小它将起作用