java无法理解IndexOutOfBoundsException
我不知道这是不是一个简单的问题,但我就是看不出问题是什么。现在,我在谷歌Play上的应用程序中收到了三份关于points.get(++i)
的IndexOutOfBoundsException的报告
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
没有在自己的线程中运行,是吗
# 1 楼答案
您的问题在for循环中。虽然第一次访问可以工作,但第二次访问不能保证正确。如果只有一个对象,则循环无法工作,因为您试图访问数组中不存在的下一个元素
# 2 楼答案
假设数组长度为10
您可以将此语句替换为 ^^^
这里和这里的Y值都在增加
在for循环中,它检查
i<points.size()
表示它9或小于9当您到达9 在for循环中,您正在访问
points.get(++i);
它将访问points.get(10)
<;--这里有个例外而你的arry是0-9那么在10
# 3 楼答案
正确使用点对象,如:
打印或使用。。这正是问题所在。x和点。我还是很累。(在
android.graphics.Point;
的情况下)如果要存储多个点,可以使用例如ArrayList
要循环它,请执行以下操作:
# 4 楼答案
通过让for循环构造处理所有的
i
变量逻辑,我可以使for循环不受类似问题的影响,而不要自己尝试这样做# 5 楼答案
问题出在这一行:
当
i = points.size()-1
时,预增量,然后调用points.get(++i);
。此时,i = points.size()
=>;禁止进入只需移除++
即可修复它编辑 或者,您可以尝试以下方法:
# 6 楼答案
试一试