0

ホームボタンをクリックすると onPause メソッドが呼び出されますが、前にアプリケーションを呼び出すと onResume が呼び出されてクラッシュします。

インデックスが範囲外の場合のコードがあります:

while (isRunning) {
                if (!ourHolder.getSurface().isValid())
                    continue;

                Canvas canvas = ourHolder.lockCanvas();
                canvas.drawRGB(02, 02, 150);
                fingerx = (x - (Gball.getWidth() / 2));
                fingery = (y - (Gball.getHeight() * 2));
                for (int i = 0; i < balls.size(); i++) { // here...
                    ballX[i] = i * 155;
                    canvas.drawText("" + score, 40, 100, paint);
                    canvas.drawBitmap(balls.get(i), ballX[i], ChangingY[i],
                            null);

エラーは次のとおりです。

FATAL EXCEPTION: Thread-9140
java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
at com.example.mygame.GFXSurface$GameSurface.run(GFXSurface.java:199)
at java.lang.Thread.run(Thread.java:864)

ここではインデックスが5であるべきだと知っていますが、それよりもアプリケーションが起動しない場合

再開時:

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    ourSurfaceView.resume();
}



public void resume() {
            isRunning = true;
            ourThread = new Thread(this);
            ourThread.start();
        }

実行方法:

@Override
        public void run() {

            for (int j = 0; j < 4; j++) {
                balls.add(j, RandomBall());
            }
            Paint paint = new Paint();
            paint.setColor(Color.RED);
            paint.setTextSize(100);
            paint1.setStyle(Style.FILL);
            paint1.setColor(Color.RED);

            while (isRunning) {
                if (!ourHolder.getSurface().isValid())
                    continue;

                Canvas canvas = ourHolder.lockCanvas();
                canvas.drawRGB(02, 02, 150);
                fingerx = (x - (Gball.getWidth() / 2));
                fingery = (y - (Gball.getHeight() * 2));
                for (int i = 0; i < balls.size(); i++) {
                    ballX[i] = i * 155;
                    canvas.drawText("" + score, 40, 100, paint);
                    canvas.drawBitmap(balls.get(i), ballX[i], ChangingY[i],
                            null);
                    if (x != 0 && y != 0 && mode == 0) {
                        if (fingerx < 0) {
                            canvas.drawBitmap(Gball, 0, fingery, null);
                        } else if (fingery < 0) {
                            canvas.drawBitmap(Gball, fingerx, 0, null);
                        }
                        else
                            canvas.drawBitmap(Gball, fingerx, fingery, null);
                        checkForCollision(i);
                    }
                    if (ChangingY[i] <= canvas.getHeight()) {
                        ChangingY[i] += 1 * speed;
                    } else if (ChangingY[i] > canvas.getHeight()) {
                        ChangingY[i] = -72;
                        if (speed <= 11)
                            speed += 0.25;
                        removeAndAdd(this, i);

                    }
                }

                ourHolder.unlockCanvasAndPost(canvas);
            }
        }
4

1 に答える 1

1

のサイズに基づいてループしていますが、ループ内では index のballs両方にアクセスしballX て使用しています。がボールより小さい場合は、ArrayIndexOutOfBoundsException が発生します。ChangingYiballX

ループ中に配列内の値を更新しているため、ループが開始する前にballXのサイズを使用して新しい配列を作成することをお勧めします。balls

ballX = new int[balls.size()];

ChangingY が何であるかはわかりませんが、少なくともボールと同じ大きさであることを確認する必要があります。

于 2012-09-22T11:44:43.283 に答える