0

I am getting this error when I am trying to remove an item from an arraylist after it collides with something else. Below is my AsyncTask and the logcat error that goes with it. Does anyone see where I am going wrong?

Here is my 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;
        }

Logcat

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
2
  • As the logcat shows: Caused by: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1, your array size is 1 and you try to access index 1. Post your code. Commented Mar 21, 2013 at 0:03
  • index should be 0 when size is 1, it's all in stacktrace. Commented Mar 21, 2013 at 0:07

2 Answers 2

1

As the logcat states

     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)

You are trying to access index 1 (second item of Array) when the size is only one, meaning the only available index is 0. It occurs at line 462 of Main.java. Post at least the AsyncTask for more help but you can look there and see why it is trying to access something that has been removed or is otherwise not there

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you but I should have been more clear. Which is line 462? You are trying to access an index there that is => size. You probably remove something and don't account for that
0

For all your loop that has the method remove change the code as the following example

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

change to

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

In another word start from the end of the array and go backward when you try to remove element.

2 Comments

When you remove backward the remaining index is not affected. So if you start from 10 and removing index 8, the remaining index 7,6... is not affected and you still going to process them even the array size now change to one less.
Thank you, I will proceed to do it this way in all my future programming.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.