当我尝试在与其他内容发生碰撞后从arraylist中删除某个项目时,我收到此错误。下面是我的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;
}
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
答案 0 :(得分:1)
由于logcat状态
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(Array
的第二项),这意味着唯一可用的索引是0.它出现在Main.java
的第462行。至少发布AsyncTask
以获得更多帮助,但您可以查看原因,看看为什么它会尝试访问已删除的内容或者不存在的内容
答案 1 :(得分:0)
对于具有方法remove
的所有循环,请按以下示例更改代码
for(int i = 0; i < enemies.size(); i++)
更改为
for(int i = enemies.size() - 1; i > -1; i--)
换句话说,从数组的末尾开始,当你尝试删除元素时向后移动。