Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';我不理解IndexOutOfBoundsException_Java_Android_Indexoutofboundsexception - Fatal编程技术网

Java Can';我不理解IndexOutOfBoundsException

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、

我不知道这是不是一个简单的问题,但我就是看不出问题是什么。现在,我在Google Play上的应用程序中收到了三份关于
点的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吗?重点是什么?点对象?点只是一个整数数组。什么是点对象?信息技术