我不知道这是不是一个简单的问题,但我只是看不出问题所在。我现在已经在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
没有在自己的线程中运行,是吗?
答案 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
}