Допустим, игрок 0 убит. Когда вы удаляете его пулю, все остальные пули перемещаются вниз на одну в индексе. Поэтому, когда индекс увеличивается до 1, вы будете смотреть на то, что изначально было маркером 2, а не маркером 1.
При удалении из списка по индексу, всегда проходят через циклы в обратном порядке, чтобы не влиять на порядок элементов, которые еще нужно просмотреть.
Однако проблема, которую вы видите (капо), возникает, если последняя пуля что-то убивает. Пока вы находитесь в цикле for (j), вы удаляете последнюю пулю. Следующий вызов getBullet (i) потерпит неудачу, потому что больше нет маркера i, теперь есть только i-1. Когда пуля что-то убивает, вы должны вырваться из внутренней петли. (Предполагая, что пуля не может убить 2 пришельцев одновременно)
Тем не менее, вы будете гораздо лучше обслуживаться
- Используя новый стиль зацикливания,
for (Bullet bullet : player.getBullets() {}
Это действительно действительно упростит ваш код !!!
Подумайте не удалять на лету. Соберите все, что нужно удалить, в два временных списка: deadAliens и usedBullets. В конце вашего цикла вызов
aliens.getAliens (). RemoveAll (deadAliens);
player.getBullets () RemoveAll (deadBullets);.