# [erledigt]Iteratorprobleme bei Partikelsystem



## norm4n (4. Jul 2008)

Hallo, 

Ich bin gerade damit beschäftigt ein ziemlich anspruchsloses Partikelsystem zu programmieren. Dazu habe ich eine Klasse "Partikel" mit den Eigenschaften Farbe, Lebensdauer, Geschwindigkeit und Position erschaffen. In dieser Klasse ist ein Konstruktor an den alle Paramter übergeben werden, eine Methode draw, die ein Rechteck mit 1*1 Höhe/Breite, an die gewünschte Position, in der gewünschten Farbe, zeichnet und eine update Funktion, die Bewegungen und Lebensdauer verwaltet. 
Desweiteren existiert eine Klasse "Partikelsystem". Diese verfügt über einen Vektor, in den ich eine beliebige Anzahl von Partikeln, mit gewollten Eigenschaften, speichere. Partikelsystem hat eine Methode draw, die über einen Iterator alle Partikel im Vektor durchgeht und bei denen die Methode draw aufruft. Das gleiche gilt für die Methode update.

Das funktioniert auch alles soweit, bis zu dem Punkt an dem ich tote Partikel aus dem Vektor löschen will. Dies wollte ich so implementieren, dass in der update Methode des Partikelsystems, mit Hilfe eines Iterators, jeder Partikel überprüft wird und wenn er tot ist, gelöscht wird. Doch das macht anscheinend ein Problem.

Am besten ich poste an dieser Stelle mal etwas Code: 

Die draw und update Methode aus der Klasse Partikelsystem: 


```
//draw
    public void draw(Graphics g) {
        for(Iterator<Partikel> iter=partikel.iterator(); iter.hasNext();) {
            iter.next().draw(g);
        }
    }
    
    //update
    public void update() {
        //Bewegung/Farbe veraendern
        for(Iterator<Partikel> iter=partikel.iterator(); iter.hasNext();) {
            iter.next().update();
        }  
       //Partikel loeschen
       for(Iterator<Partikel> iter=partikel.iterator(); iter.hasNext();) {
           if(iter.next().tot()) partikel.remove(iter);
       }
    
    }
```

In der Klasse GamePanel extends JPanel implements Runnable (nach Tut von Quaxli  ) habe ich eine run Methode:

```
public void run() {
        while(0==0) {
            computeDelta(); //momentan nur fuer FPS anzeige
            doLogic(); 
            repaint();
            try {
               Thread.sleep(10);
            } catch (InterruptedException e) {}
        }
    }
```

Die doLogic Methode: 

```
//doLogic
    public void doLogic() {
          ps.update() //ps ist das Partikelsystem      
    }
```

und die paintComponents Methode: 

```
@Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //FPS Anzeige
        g.setColor(Color.red);
        g.drawString("FPS: " + Long.toString(fps), 20, 10);

        ps.draw(g);
    }
```

Der Fehler, der auftaucht, sobald ein Partikel gelöscht werden soll, ist folgender: "Exception in thread "Thread-1" java.util.ConcurrentModificationException" 
und weiter unten ein Verweis: "at partikelsystem.PartikelSystem.update(PartikelSystem.java:61)"

Diese Exception wird wohl geworfen, wenn ein Iterator eine Änderung an einem System vornimmt, über welches gerade ein anderer Iterator saußt. Zumindest habe ich es so verstanden. Aber mir ist nicht ganz klar warum dies geschieht. Während der //Partikel loeschen - Schleife ist doch kein anderer Iterator am Werk.  ???:L  

Danke schonmal im Vorraus


----------



## SlaterB (4. Jul 2008)

> partikel.remove(iter); 

wieso willst du aus der Liste den Iterator entfernen, der ist da doch gar nicht drin 

iter.remove(); 
entfern dagegen das zuletzt von next() zurückgegebene Element der Liste


----------



## norm4n (4. Jul 2008)

Danke! So funktioniert es. Allerdings wird die gleiche Exception geworfen mit einem Verweis auf die ps.draw(g) Methode (dafür ohne Absturz). Jetzt habe ich die ps.update() aus der doLogic() raus und in die paintComponent() rein und das Sytem läuft^^


----------

