无法理解IndexOutOfBoundsException

时间:2012-08-20 17:37:54

标签: java android indexoutofboundsexception

我不知道这是不是一个简单的问题,但我只是看不出问题所在。我现在已经在Google Play中的应用程序中获得了三个报告{1}}的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没有在自己的线程中运行,是吗?

6 个答案:

答案 0 :(得分:3)

问题出在这一行:

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

i = points.size()-1,你预先增量,然后你调用points.get(++i);。此时,i = points.size() =&gt;出界。只需删除++即可修复它。

修改 或者,您可以尝试这种方法:

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;
}

答案 1 :(得分:1)

通过让for循环结构处理所有i变量逻辑,我会通过这样的问题使for循环安全,不要试图自己动手。

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);
}

答案 2 :(得分:0)

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

答案 3 :(得分: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)&lt; --------这里你得到例外

你的arry 0-9 然后 10

答案 4 :(得分:0)

尝试

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

答案 5 :(得分: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
    }