Java Can';我不理解IndexOutOfBoundsException
我不知道这是不是一个简单的问题,但我就是看不出问题是什么。现在,我在Google Play上的应用程序中收到了三份关于Java Can';我不理解IndexOutOfBoundsException,java,android,indexoutofboundsexception,Java,Android,Indexoutofboundsexception,我不知道这是不是一个简单的问题,但我就是看不出问题是什么。现在,我在Google Play上的应用程序中收到了三份关于点的IndexOutOfBoundsException的报告。get(++I) publicgamethread(SurfaceHolder-sHolder、Context-Context、Handler) { points=新的ArrayList(); 运行=真; mSurfaceHolder=支撑架; } 受保护的void doDraw(画布) { 油漆p=新油漆(); p、
点的IndexOutOfBoundsException的报告。get(++I)
publicgamethread(SurfaceHolder-sHolder、Context-Context、Handler)
{
points=新的ArrayList();
运行=真;
mSurfaceHolder=支撑架;
}
受保护的void doDraw(画布)
{
油漆p=新油漆();
p、 设置样式(油漆、样式、填充);
p、 setColor(Color.WHITE);
对于(int i=0;i
它失败的索引试图访问与其大小相等的位置(实际上有一个错误是
java.lang.IndexOutOfBoundsException:索引2205无效,大小为2206
,这对我来说毫无意义),并且大小不同
我能看到这种情况发生的唯一方式是,由于某种原因,只有一个对象被添加到点,我不知道为什么会发生这种情况
onTouchEvent
没有在自己的线程中运行,是吗?您的问题在for循环中。虽然第一次访问可以工作,但第二次访问不能保证正确。如果只有一个对象,则循环无法工作,因为您试图访问数组中不存在的下一个元素。您的问题在for循环中。虽然第一次访问可以工作,但第二次访问不能保证正确。如果您只有一个对象,则循环无法工作,因为您试图访问数组中不存在的下一个元素。问题出在这一行:
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;
}
列出点=。。。
受保护的void doDraw(画布){
油漆p=新油漆();
p、 设置样式(油漆、样式、填充);
p、 setColor(Color.WHITE);
对于(点p:点){
画布.绘图点(p.x,p.y,p);
}
}
公共布尔onTouchEvent(MotionEvent事件){
float x=event.getX();
float y=event.getY();
点。添加(新点(x,y));
返回true;
}
问题出在这一行:
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;
}
列出点=。。。
受保护的void doDraw(画布){
油漆p=新油漆();
p、 设置样式(油漆、样式、填充);
p、 setColor(Color.WHITE);
对于(点p:点){
画布.绘图点(p.x,p.y,p);
}
}
公共布尔onTouchEvent(MotionEvent事件){
float x=event.getX();
float y=event.getY();
点。添加(新点(x,y));
返回true;
}
假设数组长度为10
float y = points.get(++i);
您可以将此语句替换为
^^^
float y = points.get(i+1);
这里和这里的Y值都在增加
for (int i = 0; i < points.size(); i++)
^^^
for(int i=0;i
在for循环中,它检查i假设数组长度10
float y = points.get(++i);
您可以将此语句替换为
^^^
float y = points.get(i+1);
这里和这里的Y值都在增加
for (int i = 0; i < points.size(); i++)
^^^
for(int i=0;i
在for循环中,它检查iTry
for(int i=0;i
试试看
for(int i=0;i
通过让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);
}
for(int i=0;i+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);
}
for(int i=0;i+1
正确使用点对象,如:
Point point = new Point();
point.x = value;
point.y = value;
打印或使用。。只是点x和点y。(如果是android.graphics.Point;
)
如果要存储多个点,可以使用例如ArrayList
ArrayList<Point> pointArray = new ArrayList<Point>();
pointArray.add(new Point(event.getX(), event.getY()));
正确使用点对象,如:
Point point = new Point();
point.x = value;
point.y = value;
打印或使用。。只是点x和点y。(如果是android.graphics.Point;
)
如果要存储多个点,可以使用例如ArrayList
ArrayList<Point> pointArray = new ArrayList<Point>();
pointArray.add(new Point(event.getX(), event.getY()));
点在哪里定义?这是一个多线程程序/应用程序吗?一个点本身不是一个具有x,y对的对象吗?这里有一件有趣的事情,你应该将for循环的值增加i+=2吗?重点是什么?点对象?点只是一个整数数组。什么是点对象?听起来这可能是一个更好的选择。我只能在涉及线程的情况下看到显示的错误消息(即消息本身打印时有人在操纵集合大小),你是否自己在应用程序中创建线程?点在哪里定义?这是一个多线程程序/应用程序吗?一个点本身不是一个具有x,y对的对象吗?这里有一件有趣的事情,你应该将for循环的值增加i+=2吗?重点是什么?点对象?点只是一个整数数组。什么是点对象?信息技术