0

アイテムが他の何かと衝突した後、アレイリストからアイテムを削除しようとすると、このエラーが発生します。以下は私の AsyncTask とそれに伴う logcat エラーです。誰かが私が間違っているところを見ていますか?

ここに私の AsyncTask があります:

public class handleCollisions extends AsyncTask<String, Integer, String>
    {
        @Override
        protected String doInBackground(String... arg0) {
            Enemy tempE;
            for(int i = 0; i < enemies.size(); i++)
            {
                tempE = enemies.get(i);
                playerR = new Rect((int)x, (int)y, (int)x + player.getWidth(),(int) y + player.getHeight());
                enemyR = new Rect(tempE.x, tempE.y, tempE.x + tempE.width, tempE.y + tempE.height);
                if(Rect.intersects(playerR, enemyR))
                {
                    collision = true;
                    int exX = (int)tempE.x + (int)tempE.width - explosionBig.getWidth();
                    int exY = (int)tempE.y + (int)tempE.height + (int)tempE.height/2 - explosionBig.getHeight();
                    Explosion tempEX = new Explosion(exX, exY);
                    explosions.add(tempEX);
                    int ex2X = (int)x + (int)player.getWidth() - explosionBig.getWidth();
                    int ex2Y = (int)y + (int)player.getHeight() + (int)player.getHeight()/2 - explosionBig.getHeight();
                    Explosion temp2EX = new Explosion(ex2X, ex2Y);
                    explosions.add(temp2EX);
                    enemies.remove(i);
                    x = -200;
                    y = 300;
                    lives--;
                }
                Bullet tempB;
                for(int b = 0; b < bullets.size(); b++)
                {
                    tempB = bullets.get(b);
                    playerBulletR = new Rect(tempB.x, tempB.y, tempB.x + playerBullet.getWidth(), tempB.y + playerBullet.getHeight());
                    if(Rect.intersects(playerBulletR, enemyR) && tempE.x <= SCREEN_WIDTH)
                    {
                        int exX = (int)tempE.x + (int)tempE.width - explosionBig.getWidth();
                        int exY = (int)tempE.y + (int)tempE.height + (int)tempE.height/2 - explosionBig.getHeight();
                        Explosion tempEX = new Explosion(exX, exY);
                        explosions.add(tempEX);
                        enemies.remove(i);
                        bullets.remove(b);
                        score++;
                    }
                }
            }
            for(int i = 0; i < enemyBullets.size(); i++)
            {
                EnemyBullet tempEB = enemyBullets.get(i);
                playerR = new Rect((int)x, (int)y, (int)x + player.getWidth(),(int) y + player.getHeight());
                Rect enemyBR = new Rect((int)tempEB.x, (int)tempEB.y, (int)tempEB.x + tempEB.width, (int)tempEB.y + tempEB.height);
                if(Rect.intersects(playerR, enemyBR))
                {
                    collision = true;
                    int ex2X = (int)x + (int)player.getWidth() - explosionBig.getWidth();
                    int ex2Y = (int)y + (int)player.getHeight() + (int)player.getHeight()/2 - explosionBig.getHeight();
                    Explosion temp2EX = new Explosion(ex2X, ex2Y);
                    explosions.add(temp2EX);
                    x = -200;
                    y = 300;
                    enemyBullets.remove(i);
                    lives--;
                }
                Bullet tempB;
                for(int b = 0; b < bullets.size(); b++)
                {
                    tempB = bullets.get(b);
                    playerBulletR = new Rect(tempB.x, tempB.y, tempB.x + playerBullet.getWidth(), tempB.y + playerBullet.getHeight());
                    if(Rect.intersects(playerBulletR, enemyBR))
                    {
                        enemyBullets.remove(i);
                        bullets.remove(b);
                    }
                }
            }
            if(lives <= 0)
            {
                for(int i = 0; i < enemies.size(); i++)
                    enemies.remove(i);
                for(int i = 0; i < enemyBullets.size(); i++)
                    enemyBullets.remove(i);
                for(int i = 0; i < bullets.size(); i++)
                    bullets.remove(i);
                for(int i = 0; i < explosions.size(); i++)
                    explosions.remove(i);
                for(int i = 0; i < clouds.size(); i++)
                    clouds.remove(i);
                v.isItOk = false;
                FileOutputStream fos;
                try
                {
                    String mode = "touch";
                    fos = openFileOutput("current_score", Context.MODE_PRIVATE);
                    fos.write(mode.getBytes());
                    fos.close();
                } 
                catch (FileNotFoundException e) 
                {
                    e.printStackTrace();
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
                score = 0;
                finish();
            }
            return null;
        }

ログキャット

03-20 20:00:25.426: E/AndroidRuntime(4905): FATAL EXCEPTION: AsyncTask #3
03-20 20:00:25.426: E/AndroidRuntime(4905): java.lang.RuntimeException: An error occured while executing doInBackground()
03-20 20:00:25.426: E/AndroidRuntime(4905):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.lang.Thread.run(Thread.java:856)
03-20 20:00:25.426: E/AndroidRuntime(4905): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.util.ArrayList.remove(ArrayList.java:399)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at com.jister13.plane.Main$handleCollisions.doInBackground(Main.java:462)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at com.jister13.plane.Main$handleCollisions.doInBackground(Main.java:1)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-20 20:00:25.426: E/AndroidRuntime(4905):     ... 5 more
4

2 に答える 2

1

ログキャットが述べているように

     Caused by: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at java.util.ArrayList.remove(ArrayList.java:399)
03-20 20:00:25.426: E/AndroidRuntime(4905):     at com.jister13.plane.Main$handleCollisions.doInBackground(Main.java:462)

サイズが 1 しかないときに、インデックス 1 ( の 2 番目の項目) にアクセスしようとしていますArray。つまり、利用可能な唯一のインデックスは 0 です。これは の 462 行目で発生しMain.javaます。詳細については、少なくともAsyncTaskを投稿してください。ただし、そこを見て、削除されたものや存在しないものにアクセスしようとしている理由を確認できます。

于 2013-03-21T00:06:45.253 に答える
0

メソッドを持つすべてのループについてremove、次の例のようにコードを変更します

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

への変更

for(int i = enemies.size() - 1; i > -1; i--)  

別の言い方をすれば、要素を削除しようとすると、配列の末尾から開始して逆方向に移動します。

于 2013-03-21T00:32:24.110 に答える