有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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没有在自己的线程中运行,是吗


共 (6) 个答案

  1. # 1 楼答案

    您的问题在for循环中。虽然第一次访问可以工作,但第二次访问不能保证正确。如果只有一个对象,则循环无法工作,因为您试图访问数组中不存在的下一个元素

  2. # 2 楼答案

    假设数组长度为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)<;--这里有个例外

    而你的arry是0-9那么在10

  3. # 3 楼答案

    正确使用点对象,如:

    Point point = new Point();
    
    point.x = value;
    point.y = value;
    

    打印或使用。。这正是问题所在。x和点。我还是很累。(在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
        }
    
  4. # 4 楼答案

    通过让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);
    }
    
  5. # 5 楼答案

    问题出在这一行:

    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;
    }
    
  6. # 6 楼答案

    试一试

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