0

我不知道这是否是一个简单的问题,但我就是看不出问题所在。我现在从 Google Play 中的应用程序中收到了三份关于 IndexOutOfBoundsException 的报告points.get(++i)

public GameThread(SurfaceHolder sHolder, Context context, Handler handler)
{
    points = new ArrayList<Float>();
    running = true;
    mSurfaceHolder = sHolder;
}
protected void doDraw(Canvas canvas)
{
    Paint p = new Paint();
    p.setStyle(Paint.Style.FILL);
    p.setColor(Color.WHITE);

    for (int i = 0; i < points.size(); i++)
    {
        float x = points.get(i);
        float y = points.get(++i);

        canvas.drawPoint(x, y, p);
    }
}

public boolean onTouchEvent(MotionEvent event)
{   
    float x = event.getX();
    float y = event.getY();

    points.add(x);
    points.add(y);

    return true;
}

它失败的索引是试图访问与其大小相等的位置(实际上一个错误说 java.lang.IndexOutOfBoundsException: Invalid index 2205, size is 2206这对我来说根本没有意义),并且它的大小会有所不同。

我能看到这种情况发生的唯一方法是,如果由于某种原因只将一个对象添加到点,我不知道为什么会发生这种情况。onTouchEvent不是在自己的线程中运行,是吗?

4

6 回答 6

3

问题出在这一行:

float y = points.get(++i);

当 时i = points.size()-1,您预增量,然后调用points.get(++i);。此时,i = points.size()=> 越界。只需删除++即可修复它。

编辑 或者,您可以尝试这种方法:

List<Point> points = ...

protected void doDraw(Canvas canvas) {
   Paint p = new Paint();
   p.setStyle(Paint.Style.FILL);
   p.setColor(Color.WHITE);

   for (Point p : points) {
      canvas.drawPoint(p.x, p.y, p);
   }
}

public boolean onTouchEvent(MotionEvent event) {   
   float x = event.getX();
   float y = event.getY();

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

   return true;
}
于 2012-08-20T17:43:58.477 回答
1

我会通过让 for 循环构造处理所有变量逻辑来使 for 循环免受此类问题的影响i,不要尝试自己做。

for (int i = 0; i+1 < points.size(); i+=2){
    float x = points.get(i);
    float y = points.get(i+1);

    canvas.drawPoint(x, y, p);
}
于 2012-08-20T17:45:51.970 回答
0

您的问题出在您的 for 循环中。虽然第一次访问可以工作,但不能保证第二次访问是正确的。如果您只有一个对象,则循环无法工作,因为您试图访问数组中不存在的下一个元素。

于 2012-08-20T17:41:38.040 回答
0

假设您的数组长度为10

 float y = points.get(++i);

你可以用^^^替换这个语句

float y = points.get(i+1);

您在这里和这里都增加了 Y 的值

for (int i = 0; i < points.size(); i++)
                                   ^^^

在 for 循环中,它检查是否i<points.size()意味着9或小于9

当您到达9 并在 for 循环中您正在访问points.get(++i); 它时,您将访问points.get(10)<-------- 在这里您会遇到异常

你的arry是0-9然后在10没有元素

于 2012-08-20T17:44:57.277 回答
0

尝试

 for (int i = 0; i < points.size()-1; i++)
于 2012-08-20T17:45:32.157 回答
0

正确使用您的 Point 对象,例如:

Point point = new Point();

point.x = value;
point.y = value;

打印或使用.. 它只是 point.x 和 point.y 仍然。(在 的情况下android.graphics.Point;

如果要存储多个点,可以使用例如 ArrayList

ArrayList<Point> pointArray = new ArrayList<Point>();
pointArray.add(new Point(event.getX(), event.getY()));

循环它:

    for(Point p : pointArray){
        // do something with p.x and p.y
    }
于 2012-08-20T17:50:53.563 回答