Как правильно? - Java

Узнай цену своей работы

Формулировка задачи:

Есть два списки, которые пополняются и очищаются: - пули, которые постоянно создаются и удаляются, когда вылетают за пределы екрана или когда касаются врагов; - враги, которые создаются не в бесконечном количестве, а порциями по 5, не вылетают за пределы екрана и должны уничтожатся при прикосновении с пулей. Такое уничтожение я пытаюсь реализовать в следующем методе. Такой метод работает и удаляет пулю и врага при их соприкосновении. Проблема следующая: Выбрасывает ошибку при определенном моменте, но не всегда. "Как карта ляжет". Как мне кажеться, ошибка чаще выбрасывается при большом количестве врагов или пуль на екране. Я новичек, потому еще не очень много понимаю
public void testCllisionEnemyWithPatron() {
        
        Iterator<Patron> patronsIterator = Patron.patrons.iterator();
        
        while(patronsIterator.hasNext()) {
            Patron p = patronsIterator.next();
            Iterator<Enemy> enemiesIterator = Enemy.enemies.iterator();
            while(enemiesIterator.hasNext()) {
                Enemy e = enemiesIterator.next();
            
                if(e.getRect().intersects(p.getPatronsRect())) {
                    patronsIterator.remove(); // сюда указывает ошибка
                    enemiesIterator.remove();
                }
            }
        }
    }
Ошибка:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException at java.util.ArrayList$Itr.remove(Unknown Source) at newjavapj.Background.testCllisionEnemyWithPatron(Background.java:155) at newjavapj.Background.actionPerformed(Background.java:96) at javax.swing.Timer.fireActionPerformed(Unknown Source) at javax.swing.Timer$DoPostEvent.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$500(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

Решение задачи: «Как правильно?»

textual
Листинг программы
public void testCllisionEnemyWithPatron() {
    ArrayList<Patron> patrons = getPatrons();
    for(Patron p : patrons){
         Rectangle r1 = p.getBounds();
              for(Enemy e : enemies){
                   Rectangle r2 = e.getBounds();
                   
                if(r1.intersects(r2)){
                   p.setVisible(false);
                   e.setVisible(false);
           }
 
     }
  }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5