问题
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
回答1:
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:
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
来源:https://stackoverflow.com/questions/15537097/error-when-removing-from-arraylist