触摸时从 arrayList 中删除精灵 - "Invalid index 4, size is 4"

Remove sprite from arrayList when touched - "Invalid index 4, size is 4"

您好,我正在尝试编写一个循环遍历数组列表的方法,以检查数组列表中的精灵是否已被触摸,如果是,则将其删除。我已经写了这个方法,但是当我点击精灵时,它们会停止并振动然后游戏崩溃。 Logcat 提供如下

onTouchEvent

public class GameView extends SurfaceView implements SurfaceHolder.Callback {

    /* Member (state) fields   */
    private GameLoopThread gameLoopThread;
    private Paint paint; //Reference a paint object 
    /** The drawable to use as the background of the animation canvas */
    private Bitmap mBackgroundImage;
    private Sprite sprite;
    int arraySize;
    private int hitCount;

    private ArrayList<Sprite> spritesArrayList;
    private GameView gameView;
    int numberofsprites = 5;
    int finalScore;
    private boolean gameOver;
    /* For the countdown timer */
    private long  startTime ;           //Timer to count down from
    private final long interval = 1 * 1000;     //1 sec interval
    private CountDownTimer countDownTimer;  //Reference to class
    private boolean timerRunning = false;
    private String displayTime;         //To display time on the screen

    private Bitmap spritebmp;


    public GameView(Context context) {

        super(context);
        // Focus must be on GameView so that events can be handled.
        this.setFocusable(true);
        // For intercepting events on the surface.
        this.getHolder().addCallback(this);
        mBackgroundImage = BitmapFactory.decodeResource(this.getResources(),
                R.drawable.background2);
        spritesArrayList= new ArrayList<Sprite>(numberofsprites);
    }



    public void surfaceCreated(SurfaceHolder holder) {
        mBackgroundImage = Bitmap.createScaledBitmap(mBackgroundImage, getWidth(), getHeight(), true);
        ResetGame();
        gameLoopThread = new GameLoopThread(this.getHolder(), this);
        gameLoopThread.running = true;
        gameLoopThread.start();

    }

    //To initialise/reset game
    private void ResetGame(){
        gameOver = false;
        hitCount = 0;
        /* Set paint details */
        paint = new Paint();
        paint.setColor(Color.WHITE); 
        paint.setTextSize(20);

        //Set timer
        startTime = 60;//Start at 10s to count down
        //Create new object - convert startTime to milliseconds
        countDownTimer=new MyCountDownTimer(startTime*1000,interval);
        countDownTimer.start();//Start it running
        timerRunning = true;

        for (int i = 0; i < numberofsprites; i++) 
        { 
        sprite = new Sprite(this);
        spritesArrayList.add(new Sprite(this)); 
        }   

    }


    //This class updates and manages the assets prior to drawing - called from the Thread
    public void update(){ 
        sprite = new Sprite(this);
        if (gameOver != true) { 
            for (int i = 0; i < numberofsprites; i++) 
            { 
            sprite = spritesArrayList.get(i);
            sprite.update();
            }  
        } 
    }
    /**
     * To draw the game to the screen
     * This is called from Thread, so synchronisation can be done
     */

    public void doDraw(Canvas canvas) {
         Paint textPaint = new Paint();

        canvas.drawBitmap(mBackgroundImage, 0, 0, null);
        //Draw all the objects on the canvas
        canvas.drawText("The Game ",5,25, paint);
        canvas.drawText("Score: " + hitCount, 5, 50, paint);
        canvas.drawText("Time: " +displayTime, 5, 75, paint);

         //Loop for sprite creation

         for (int i = 0; i < spritesArrayList.size(); i++) 
         {          
            sprite = spritesArrayList.get(i);   
            sprite.draw(canvas);

         }




        if (gameOver == true)
        {
            canvas.drawText("Final Score: "+finalScore, 5,100, paint);
            int width = this.getMeasuredWidth()/2;
            int height = this.getMeasuredHeight()/2;
            textPaint.setTextAlign(Align.CENTER);
            canvas.drawText("GAME OVER - PRESS BACK BUTTON TO RETURN", width, height, textPaint);
        }

    }
    public int getHitCount()
    {
        return hitCount;
    }
    //To be used if we need to find where screen was touched
    public boolean onTouchEvent(MotionEvent event) {
        if (!gameOver)
        {
            Iterator<Sprite> i = spritesArrayList.iterator();
            while (i.hasNext()) {
                sprite = i.next();   
                if (sprite.wasItTouched(event.getX(), event.getY())) {
                        i.remove();
                       sprite = new Sprite(this);  
                       sprite.update();
                       hitCount++;         
                }

            }

        }

        return true;
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        gameLoopThread.running = false;

        // Shut down the game loop thread cleanly.
        boolean retry = true;
        while(retry) {
            try {
                gameLoopThread.join();
                retry = false;
            } catch (InterruptedException e) {}
        }
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }
    private class MyCountDownTimer extends CountDownTimer {

          public MyCountDownTimer(long startTime, long interval) {
                super(startTime, interval);
          }
          public void onFinish() {
                displayTime = "Times Over!";
                finalScore = hitCount;
                gameOver = true;
                timerRunning = false;
                countDownTimer.cancel();
          }
          public void onTick(long millisUntilFinished) {
                displayTime = " " + millisUntilFinished / 1000;
          }
        }//End of MyCountDownTimer

      public void updateEasy()
        {
          this.gameView=gameView;
           numberofsprites = 20;

        }
        public void updateMedium()
        {
            this.gameView=gameView;
            numberofsprites = 15;   
        }
        public void updateHard()
        {
            this.gameView=gameView;
            numberofsprites = 5;
        }



}

Logcat

   05-06 14:36:41.613: E/AndroidRuntime(1639): FATAL EXCEPTION: main
05-06 14:36:41.613: E/AndroidRuntime(1639): Process: cct.mad.lab, PID: 1639
05-06 14:36:41.613: E/AndroidRuntime(1639): java.lang.IllegalStateException
05-06 14:36:41.613: E/AndroidRuntime(1639):     at java.util.ArrayList$ArrayListIterator.remove(ArrayList.java:589)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at cct.mad.lab.GameView.onTouchEvent(GameView.java:166)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.View.dispatchTouchEvent(View.java:7706)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.View.dispatchPointerEvent(View.java:7886)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5602)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5582)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5553)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5682)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5655)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5701)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.Choreographer.doCallbacks(Choreographer.java:574)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.Choreographer.doFrame(Choreographer.java:542)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.os.Handler.handleCallback(Handler.java:733)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.os.Handler.dispatchMessage(Handler.java:95)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.os.Looper.loop(Looper.java:136)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at android.app.ActivityThread.main(ActivityThread.java:5017)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at java.lang.reflect.Method.invokeNative(Native Method)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at java.lang.reflect.Method.invoke(Method.java:515)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-06 14:36:41.613: E/AndroidRuntime(1639):     at dalvik.system.NativeStart.main(Native Method)
05-06 14:36:41.633: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:41.633: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:41.633: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:41.633: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:41.633: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:41.703: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:41.703: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:41.703: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:41.713: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:41.713: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:41.763: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:41.763: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:41.763: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:41.783: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:41.783: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:41.823: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:41.823: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:41.823: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:41.823: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:41.823: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:41.863: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:41.863: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:41.873: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:41.873: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:41.873: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:41.903: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:41.903: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:41.903: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:41.903: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:41.913: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:41.933: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:41.933: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:41.933: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:41.933: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:41.943: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:41.953: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:41.953: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:41.953: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:41.953: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:41.953: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:41.963: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:41.963: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:41.963: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:41.973: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:41.973: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:41.993: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:41.993: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.023: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.023: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.043: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.063: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.063: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.073: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.073: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.073: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.073: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.083: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.083: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.083: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.083: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.113: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.113: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.113: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.113: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.123: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.143: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.143: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.143: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.143: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.153: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.193: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.243: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.243: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.243: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.253: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.253: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.263: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.263: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.263: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.263: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.323: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.323: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.333: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.333: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.333: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.523: D/dalvikvm(1639): GC_FOR_ALLOC freed 618K, 66% free 4491K/13092K, paused 159ms, total 163ms
05-06 14:36:42.553: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.553: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.553: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.553: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.553: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.583: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.583: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.583: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.593: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.593: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.623: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.623: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.623: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.623: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.633: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.653: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.653: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.683: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.683: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.693: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.733: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.733: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.733: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.733: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.733: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.783: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.783: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.783: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.783: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.793: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.843: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.853: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.853: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.853: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.853: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.883: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.883: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.883: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.883: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.893: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:42.933: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:42.933: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:42.933: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:42.933: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:42.943: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:43.003: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:43.003: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:43.003: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:43.013: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:43.013: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:43.073: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:43.073: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:43.073: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:43.073: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:43.113: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:43.143: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:43.153: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:43.153: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:43.153: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:43.153: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:43.273: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:43.273: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:43.273: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:43.273: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:43.273: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:43.313: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:43.313: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:43.323: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:43.463: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)
05-06 14:36:43.493: W/System.err(1639):     at cct.mad.lab.GameLoopThread.run(GameLoopThread.java:50)
05-06 14:36:43.493: W/System.err(1639): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-06 14:36:43.503: W/System.err(1639):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-06 14:36:43.503: W/System.err(1639):     at java.util.ArrayList.get(ArrayList.java:308)
05-06 14:36:43.503: W/System.err(1639):     at cct.mad.lab.GameView.update(GameView.java:106)

从 ArrayList 中删除一个元素也会改变 ArrayList 本身中的元素数量。你少了一个项目,但你仍然在列表上循环,因为它仍然有相同数量的项目。改用迭代器:例如

Iterator<Sprite> i = spritesArrayList.iterator();
while (i.hasNext()) {
    sprite = i.next();   
    if (sprite.wasItTouched(event.getX(), event.getY())) {
           i.remove();    
           sprite = new Sprite(this);  
           hitCount++;         
    }
}

你应该替换这些:

public void update(){ 
    sprite = new Sprite(this);
    if (gameOver != true) { 
        for (int i = 0; i < numberofsprites; i++) 
        { 
        sprite = spritesArrayList.get(i);
        sprite.update();
        }  
    } 
}

public void update(){ 
    sprite = new Sprite(this);
    if (gameOver != true) { 
        for (int i = 0; i < spritesArrayList.size(); i++) 
        { 
            sprite = spritesArrayList.get(i);
            sprite.update();
        }  
    } 
}

        Iterator<Sprite> i = spritesArrayList.iterator();
        while (i.hasNext()) {
            sprite = i.next();   
            if (sprite.wasItTouched(event.getX(), event.getY())) {
                    i.remove();
                   sprite = new Sprite(this);  
                   sprite.update();
                   hitCount++;         
            }

        }

      for(int i = 0; i < spritesArrayList.size(); i++) {
            sprite = spritesArrayList.get(i);
            if (sprite.wasItTouched(event.getX(), event.getY())) {
                   spritesArrayList.remove(i--);
                   sprite = new Sprite(this);  
                   sprite.update();
                   hitCount++;         
            }

      }

这样,您将只管理实际在数组列表中的对象。