尝试使用基于1的索引创建ArrayList的索引超出范围异常

时间:2015-08-31 18:47:49

标签: java arraylist

所以到目前为止,我刚刚使用points.add(new Point(x,y))为我的ArrayList添加了点数。但是,我发现我需要第一个点在index = 1中,以便能够将每个步骤的数字相乘。所以我尝试将counter0设置为1,正如预期的那样,我知道我会因为范围而出错,但我已经尝试在一段时间内改变条件-loop,但似乎没什么用。

这是我的代码:

ArrayList<Point> points = new ArrayList<>();
int counter = 1;
int nPoints = 12;
while (counter <= nPoints) {
    x = (int) (centerX + r * Math.cos(start));
    y = (int) (centerY + r * Math.sin(start));

    points.set(counter, (new Point(x, y)));
    //points.add(new Point(x,y));

    counter++;
}

这是我得到的错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0   
    at java.util.ArrayList.rangeCheck(Unknown Source)   
    at java.util.ArrayList.set(Unknown Source)

我删除了许多与此问题无关的代码,以便于阅读。

修改

 public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            a = getWidth() /2;
            b = getHeight() /2;
            g2d.setColor(Color.RED);

            //draw cirle
            g2d.drawOval(a-r, b-r, 2*r, 2*r);

            //draw lines
            for (int  i= 1; i < points.size();i ++) {
                g2d.drawLine(points.get(i).x, points.get(i).y, points.get(i+1).x, points.get(i+1).y);

            }

           g2d.dispose();
        }

我创建了一个圆圈,我试图在圆周之间的点之间绘制线条。在这里,我希望第一点连接到2,2到4,3到6,4到8等等......所以这里的模式是每次都乘以2。所以我最初的想法是,我可以使用i循环中的for每次乘以2。但是由于我在ArrayList中的第一个i = 0点,我遇到了麻烦。

5 个答案:

答案 0 :(得分:1)

您尝试设置不存在的index

ArrayList的大小为0,但您尝试访问不存在的索引1

您可以使用ArrayList.add()ArrayList添加其他元素。如果您使用set(),则index中必须存在ArrayList

答案 1 :(得分:0)

要在索引0处插入元素,请在循环前使用points.add(null);

所以最终的代码如下:

ArrayList<Point> points = new ArrayList<>();
int counter = 1;
int nPoints = 12;
points.add(null); // <= this line was added
while (counter <= nPoints) {
    x = (int) (centerX + r * Math.cos(start));
    y = (int) (centerY + r * Math.sin(start));

    //points.set(counter, (new Point(x, y))); // <= it's not correct use
    points.add(new Point(x,y));

    counter++;
}

答案 2 :(得分:0)

使用add代替set。您无法设置(替换)不存在的项目。来自set上的文档:

  

使用指定的元素替换此列表中指定位置的元素。

您可以使用index + 1进行计算,但列表索引应该从0开始。

编辑:

//draw lines
for (int  i= 0; i < points.size() - 1;i ++){
    g2d.drawLine(points.get(i).x,
    points.get(i).y, points.get(i+1).x,
    points.get(i+1).y);
}

答案 3 :(得分:0)

如果您尝试将值设置在其范围之外,则Java中的

ArrayList不会扩展到所需的长度。当数组长度为0时,您正尝试在索引1处设置项目。试试这个:

ArrayList<Point> points = new ArrayList<>();
points.add(null);
for (int counter = 0; counter < nPoints; counter++) {
    x = (int) (centerX + r * Math.cos(start));
    y = (int) (centerY + r * Math.sin(start));

    points.add(new Point(x,y));
}
points.set(0, points.get(1));

编辑:您生成相同的Point nPoints次。用角度做点什么,例如:

x = (int) (centerX + r * Math.cos(start + counter * 0.01));
y = (int) (centerY + r * Math.sin(start + counter * 0.01));

编辑:用第一个

替换第0个元素 编辑:既然您提供了绘画代码,我看到您的算法不一定使用基于1的索引。顺便说一下,我非常怀疑你从列表中得到一个零点。我怀疑即使你的列表也没有保存,并且列表上的空指针异常,而不是点。无论如何,试试这个:

ArrayList<Point> points = new ArrayList<>();
for (int counter = 0; counter < nPoints; counter++) {
    x = (int) (centerX + r * Math.cos(start));
    y = (int) (centerY + r * Math.sin(start));

    points.add(new Point(x,y));
}

// ...

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    a = getWidth() /2;
    b = getHeight() /2;
    g2d.setColor(Color.RED);

    //draw cirle
    g2d.drawOval(a-r, b-r, 2*r, 2*r);

    //draw lines
    for (int  i= 1; i < points.size();i ++) {
        g2d.drawLine(points.get(i - 1).x, points.get(i - 1).y, points.get(i).x, points.get(i).y);
    }

    g2d.dispose();
}

答案 4 :(得分:0)

就我而言,这有帮助:

if (!listName.isEmpty()) {
            return listName.get(0);
        }

希望对你有用☺️