0

これが単純な問題かどうかはわかりませんが、何が問題なのかわかりません。現在、Google Play のアプリから、IndexOutOfBoundsException の 3 件のレポートを受け取りました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;
}

失敗したインデックスは、そのサイズに等しい場所にアクセスしようとしています (実際には、1 つのエラーは java.lang.IndexOutOfBoundsException: Invalid index 2205, size is 2206まったく意味がないと言っています)、そのサイズはさまざまです。

これが起こっていることを確認できる唯一の方法は、何らかの理由でオブジェクトが 1 つだけポイントに追加された場合であり、なぜそれが起こるのかわかりません。onTouchEvent独自のスレッドで実行されていませんね。

4

6 に答える 6

1

for ループ コンストラクトにすべての可変ロジックを処理させることで、for ループをこのような問題から保護iします。自分でやろうとしないでください。

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);
}
于 2012-08-20T17:45:51.970 に答える
0

配列の長さが10であるとします

 float y = points.get(++i);

このステートメントを ^^^ に置き換えることができます。

float y = points.get(i+1);

ここだけでなく、ここでもYの値を増やしています

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

forループでは、 9または9未満でi<points.size()あることを確認します

9に到達し 、for ループでアクセスすると、 <--------points.get(++i); にアクセスします。ここで例外が発生します。points.get(10)

そしてあなたのアリーは0-9で、 10の要素はありません

于 2012-08-20T17:44:57.277 に答える
0

試す

 for (int i = 0; i < points.size()-1; i++)
于 2012-08-20T17:45:32.157 に答える