java.util.ConcurrentModificationException problem in der Logik? Quaxli-Tutorial

Status
Nicht offen für weitere Antworten.

Keylan

Mitglied
Hallo zusammen,

wie so viele andere auch, wollte ich meinen Einstieg in die Javaprogrammierung endlich mal mit vollständigen Projekten füllen, statt nur hier oder da eine Klasse in bestehende Projekte zu ergänzen.

Damit die Motivation stimmt wird also ein kleines Spiel programmiert, habe mich dafür sehr dich an das 2D-Spieletutorial von Quaxli gehalten (vielen Dank an dieser Stelle für das tolle Tutorial).
Natürlich wollte ich es nicht 1:1 nachbauen, neben anderen Grafiken bekommen die Objekte bei mir also auch andere Logiken, und es sollen später auch etwas mehr öbjekte hinzukommen.

Noch habe ich auf Dynamische Bewegungen verzichtet, nach dem Motto erstmal das grobe Spiel erschaffen, und dann verfeinern.

Im TuT bin ich jezt ca. auf Seite 52 also noch vor Kooalisionsabfragen, und Objektentrümpelung.

Wenn ich das Spiel zum Laufen lasse klappt soweit alles wie gewünscht, nur kommt nach relativ kurzer Zeit (zwischen 10 sec. und 8 min) eine Exception und das Spiel friert ein:
Code:
Exception in thread "Thread-4" java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
	at java.util.AbstractList$Itr.next(Unknown Source)
	at gamepack.GamePanel.doLogic(GamePanel.java:166)
	at gamepack.GamePanel.run(GamePanel.java:135)
	at java.lang.Thread.run(Unknown Source)

das Ganze verweist nun zum einen Auf die doLogic() Methode und dann eben auf deren Aufruf

[JAVA=165] private void doLogic(){
for(Movable mov:actors){
mov.doLogic(delta);
}
}[/code]

[JAVA=128] @Override
public void run() {
while(game_running){

computeDelta();
if(isStarted()){
checkKeys();
doLogic();
moveObjects();
}
repaint();

try{
Thread.sleep(10);
} catch(InterruptedException e) {}
}
}[/code]

Wirklich viel anfagen kann ich damit nicht vor allem habe ich überhaupt nicht verstanden warum und wie das Interfave Movable mit long-Variablen arbeitet.:bahnhof:

Nun gut ich vermute das Problem in den doLogic() Methoden meiner Objekte, was dort allerdings schief läuft kann ich mir auch nach mehrmaligen überprüfen nicht erklären.

Hier mal der Code:

Aufrufe aus der main GamePanel
[JAVA=63] private void doInitializations(){

backround = loadPics("gamepack/pics/backround2.jpg",1)[0];

last = System.nanoTime();

actors = new Vector<Sprite>();
pi = this.loadPics("gamepack/pics/Point2.gif",12);
for(int k = 1;k<10;k++){

}
BufferedImage[] player = this.loadPics("gamepack/pics/Blue4.gif",5);
beams = loadPics("gamepack/pics/Beam.gif",8);
orb = new Player(player,500,375,100,this);

actors.add(orb);

timerW = new Timer(800,this);
timerW.start();
timerP = new Timer(2000,this);
timerP.start();

if(!once){
once = true;
Thread t = new Thread(this);
t.start();
}
}
private void createHPoints(BufferedImage[] p){

int x;
if(1<Math.random()*2){x=-20;}else{x = getWidth();}
int y = (int) (Math.random()*getHeight());
Point point = new Point(p,x,y,250,this);
actors.add(point);

}
private void createVPoints(BufferedImage[] p){
int y;
if(1<Math.random()*2){y=-20;}else{y = getWidth();}
int x = (int) (Math.random()*getHeight());
Point point = new Point(p,x,y,250,this);
actors.add(point);
}

private void createBeam(){
int x = 0;
int y = (int) (Math.random()*getHeight());
int height = (int) (Math.random()*2);

if(height<1){
x = -beams[0].getWidth();
}else{
x = getWidth();
}
Beam beamObject = new Beam(beams,x,y,100,this);
beamObject.setVerticalSpeed(0);
if(x>0){
beamObject.setHorizontalSpeed(-600);
}else{
beamObject.setHorizontalSpeed(600);
}
actors.add(beamObject);
}[/code]

und hier die Objektklassen

Spielfigur Orb
Java:
package gamepack;

import java.awt.image.BufferedImage;

public class Player extends Sprite{
	
	public Player(BufferedImage[] i, double x, double y, long delay, GamePanel p){
		super(i,x,y,delay,p);
	}
	@Override
 	public void doLogic(long delta){
		super.doLogic(delta);
			
			if(getX()<0){
				setHorizontalSpeed(50);
			//	setX(0);
			}
			if(getX()+getWidth()>parent.getWidth()){
				setHorizontalSpeed(-50);
			//	setX(parent.getWidth()- getWidth());
			}
			
			if(getY()<0){
				setVerticalSpeed(50);
			//	setY(0);
			}
			if(getY()+getHeight()>parent.getHeight()){
				setVerticalSpeed(-50);
			//	setX(parent.getHeight()-getHeight());
			}
		}
	}

Punkte zum einsammeln
Java:
package gamepack;

import java.awt.image.BufferedImage;

public class Point extends Sprite{

	final int SPEED = 100;
	
	public Point(BufferedImage[] i, double x, double y, long delay, GamePanel p){
		super(i,x,y,delay,p);
	}
		
	@Override
	public void doLogic(long delta){
		super.doLogic(delta);
		
		if(getCenterX()<parent.orb.getCenterX()){
			setHorizontalSpeed(SPEED);
		//	setX(0);
		}
		if(getCenterX()>parent.orb.getCenterX()){
			setHorizontalSpeed(-SPEED);
		//	setX(parent.getWidth()- getWidth());
		}/*else{
			setHorizontalSpeed(0);
			}*/
		
		if(getCenterY()<parent.orb.getCenterY()){
			setVerticalSpeed(SPEED);
		//	setY(0);
		}
		if(getCenterY()>parent.orb.getCenterY()){
			setVerticalSpeed(-SPEED);
		//	setX(parent.getHeight()-getHeight());
		}/*else{
			setVerticalSpeed(0);
		}*/
	}
}

und die erste Gegnerklasse Strahlenschüsse
Java:
package gamepack;

import java.awt.image.BufferedImage;

public class Beam extends Sprite {
	
	public Beam(BufferedImage[] i,double x, double y, long delay, GamePanel p){
		super(i,x,y,delay,p);
	}
	@Override
	public void doLogic(long delta){
		super.doLogic(delta);
	}
	
	public void setHorizontalSpeed(double d){
		super.setHorizontalSpeed(d);
		
		if(getHorizontalSpeed()<0){
			setLoop(4,7);
		}else{
			setLoop(0,3);
		}
	}

}

Die Klasse Sprite (abstrakte überklasse aller Spielobjekte) und die Interfaces sind unverändert aus dem Tutorial übernommen.

Ja ich weis alles was nicht direkt von Quaxli übernommen ist ist gleich etwas unsauber, aber wie gesagt ich steige noch ein und lerne dazu. Gehe davon aus auch wenn alles läuft werde ich den code noch mehrfach überarbeiten.

Bevor ich mich nun daran setzen wollte die nächsten beiden GegnerKlassen zu schreiben wollte ich auf jeden fall den Bug rausbekommen.

Kann mir vieleicht jemand helfen? Suche ich überhaupt an der richtigen Stelle?

Vielen Dank schonmal für jeden Hilfeversuch
 

Teh_Lord

Mitglied
Die Exception tritt bei for-each Schleifen auf.
Ich versuche die immer zu vermeiden, auch wenn sie schön aussehen ;)
Wenn du über einen index iterierst, sollte das nicht mehr auftreten.

Ich kenne den Quelltext *g* habe den auch mal verwendet.
Naja das Problem liegt also hier:
Java:
    private void doLogic(){
        for(Movable mov:actors){
            mov.doLogic(delta);
        }
    }

Mach's doch so:
for-Schleife ändern, sodass du bequem über den Index iterieren kannst:
Java:
    private void doLogic(){
        for(int i=0;i<actors.size();i++){
            actors.get(i).doLogic(delta);
        }
    }

Geht aber hier nur, da in deinem Vector alle Objekte die doLogic Methode enthalten.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
über Vector und ArrayList läßt sich identisch iterieren,
und eine for-Schleife zu empfehlen, die auf unsaubere Weise bestimmte Missstände verdeckt, halte ich für gefährlich

leider habe ich im Moment nicht die Muße, dieses riesige Programm näher anzuschauen,
vielleicht später falls dann noch aktuell (Rückmeldung) und nicht schon wer anders alles auflöst
 

Teh_Lord

Mitglied
Dachte immer Vector arbeitet nich mit Indizes ^^

Bei der for Schleife ist eigentlich noch dazuzusagen, dass man da aufpassen muss, ja.
Die ursprüngliche Schleife hat nur über die Objekte iteriert, die Moveable sind.
Da die Elemente des Vectors aber alle Sprites sind und diese Moveable implementieren,
sollte das an dieser Stelle keinen Unterschied machen, da alle die doLogic Funktion besitzen.

Aber generell kann man das halt nicht so umwandeln, das ist wahr.
 

Keylan

Mitglied
Zu blöd das die Suchfunktion des Forums die Exception als Suchbegriff nicht zulässt (ignoriert), sonst hätte ich den Link von Marco wohl auch selbst gefunden.

Habe das Problem jetzt zwar noch nicht gelöst, aber erstma wieder einige hinweise wo ich das Problem suchen muss.

Werde mir dann nachher mal die threadsicheren Collections anschaun, und das mit dem AntiAlising war auch gleich interessant, wenn auch sicher eher ein goodie für den Abschluss des Projektes.
 

Keylan

Mitglied
Super

einfach Vector gegen CopyOnWriteArrayList ersetzen und alles läuft prima. Fast schade das es so eine Einfache lösung bereits gibt, warscheinlich werde ich so über den eigentlichen Kern des Problems nicht so viel lernen als hätte ich es elementar lösen müssen.

Bei mehreren Threads kann ich mir das ja noch erklären, aber habe ich hier meherere Threads? Ich dachte ich hätte nur einen, udn warum dieser dann ein dynamisches Objekt nicht handlen kann will ich noch nicht ganz verstehen.
 

Keylan

Mitglied
Soo inzwischen habe ich animationen etwas überarbeitet und dabei noch eine ganze Menge von den Zeichenmethoden und der Loop gelernt die nachher die Animation auswählt.

Allerdings ist mir dann aufgefallen das sich eine meiner Objektklassen nicht verhält wie sie soll.

Passt zwar nichtmehr zur Überschrift, aber ich wollte jetzt für eine kleinigkeit kein neues Thema erstellen.

Also, ich habe eine Gegnerklasse die bei Erzeugung auf mein Spieler-Objekt zufliegt, Dabei aber nicht nachträglich Korrigiert, so das dieser Ausweichen kann. Also eine Klassische Schuss Funktion würde ich sagen.

Da Bewegung und Verhalten (ohne Koalision) nur einmal bestimmt werden müssen mache ich alle Berechnungen in der aufrufenden Methode

[JAVA=91] private void createHShots(BufferedImage[] p){

int x;
if(1<Math.random()*2){x=-20;}else{x = getWidth();}
int y = (int) (Math.random()*getHeight());
Shot shot = new Shot(p,x,y,200,this);
int h = (int) (orb.getCenterX()-shot.getCenterX());
int w = (int) (orb.getCenterY()-shot.getCenterY());
shot.setHorizontalSpeed((int)((h/Math.sqrt((w*w)+(h*h)))*shotSpeed));
shot.setVerticalSpeed((int)((w/Math.sqrt((w*w)+(h*h)))*shotSpeed));
actors.add(shot);

}[/code]

orb ist dabei das Spielerobjekt das leider nicht so gut getroffen wird wie ich hoffte, wenn es unbewegt ist.

ca. 20% der Schüsse geht deutlich daneben, kleine Abweichungen kann ich aufgrund der Wurzel und des casts' nachvollziehen aber nicht so heftige.

Dazu Variiert auch die Geschwindigkeit der Schüsse sehr was auch auf fehler in der Berechnung hinweist.
 
S

Spacerat

Gast
Ganz banal würd' ich "doLogic()" so implementieren:
Java:
private void doLogic() {
  List<Movable> tmp = (List<Movable>) actors.clone();
  Iterator<Movable> i = tmp.iterator();
  while(i.hasNext()) {
    i.next().doLogic(delta);
  }
}
Das Klonen der Liste ist notwendig, wenn andere Threads während der "while"-Schleife die Liste, ob ArrayList oder Vector ist dabei egal, modifizieren. Innerhalb der "while"-Schleife (also in der "doLogic(delta)"-Methode darf die Liste ebenfalls nicht verändert werden. Modifizieren bzw. verändern der Liste bezieht sich dabei ausschliesslich auf Zugriffe, die ihre Grösse ändert. Zuletzt: Auf diese Art kann auf threadsichere Collections auch verzichtet werden. Hauptsache ist, sie implementieren "Cloneable".
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
E java.util.ConcurrentModificationException Problem Java Basics - Anfänger-Themen 5
F java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
BATMAN_2008 Jackson adding additional fields to JSON throws java.util.concurrent.CompletionException: Java Basics - Anfänger-Themen 2
R java.util.Set, CASE_INSENSITIVE_ORDER Java Basics - Anfänger-Themen 6
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
F Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ? Java Basics - Anfänger-Themen 14
N java.util.InputMismatchException Fehler Java Scanner Java Basics - Anfänger-Themen 5
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
A Java.util.Arrays Java Basics - Anfänger-Themen 15
F java.util.ArrayList Java Basics - Anfänger-Themen 3
B java.util.Date noch zeitgemäß? Java Basics - Anfänger-Themen 6
B java.util.Date berechnen Java Basics - Anfänger-Themen 11
M java.util.scanner Fehler Java Basics - Anfänger-Themen 5
Meeresgott OOP Richtig mit java.util.Property umgehen Java Basics - Anfänger-Themen 22
N java.util.Random - Zwei Zahlen mit festgesetzter Wahrscheinlichkeit? Java Basics - Anfänger-Themen 15
A Vererbungshierachie und java.util.Date Java Basics - Anfänger-Themen 31
W Erste Schritte import java.util.scanner funktioniert nicht Java Basics - Anfänger-Themen 2
I google java-diff-util - Patch abspeichern Java Basics - Anfänger-Themen 1
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
H Repräsentation von DateTime (Joda) in Java Util Date überführen Java Basics - Anfänger-Themen 3
P Variablen Abfangen von eingaben per java.util.Scanner und weiter Verarbeitung Java Basics - Anfänger-Themen 7
D java.util.NoSuchElementException: No line found Java Basics - Anfänger-Themen 11
D Lesen aus Datei (java.util.NoSuchElementException) Java Basics - Anfänger-Themen 22
S Compiler-Fehler Scanner java.util NoSuchElementExeption Java Basics - Anfänger-Themen 8
W Methoden Rückgabedatentyp java.util.Map<java.lang.String,? extends ...> Java Basics - Anfänger-Themen 4
B ThreadPoolExecutor - import java.util.concurrent Java Basics - Anfänger-Themen 2
R java.util.Random Java Basics - Anfänger-Themen 8
S Methoden Sortieren: java.util.Arrays.useLegacyMergeSort Java Basics - Anfänger-Themen 4
F java.util.scanner wird übersprungen Java Basics - Anfänger-Themen 9
O java.util.Scanner hängt sich auf Java Basics - Anfänger-Themen 5
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
D java.util.ResourceBundle - exception Java Basics - Anfänger-Themen 4
M Datentypen java.util.Arrays$ArrayList cannot be cast to [Ljava.lang.String; Java Basics - Anfänger-Themen 11
S Unterschied java.util.prefs / java.util.Properties Java Basics - Anfänger-Themen 3
M java.util.ArrayList to java.sql.Array Java Basics - Anfänger-Themen 4
D java.util.Currency Java Basics - Anfänger-Themen 2
T java.util.Date Java Basics - Anfänger-Themen 5
J java.util.format => mit String? Java Basics - Anfänger-Themen 2
N java.util.Random Java Basics - Anfänger-Themen 6
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
Luk10 Java.util.Scanner Java Basics - Anfänger-Themen 11
H ArrayList über java.util.Scanner füllen Java Basics - Anfänger-Themen 5
P ArrayList<E> in package java.util Java Basics - Anfänger-Themen 4
N java.util.Arrays.sort Warum sind Leerzeichen vor alphabetischen Zeichen sortiert? Java Basics - Anfänger-Themen 12
T import java.util.scanner cannot be resolved Java Basics - Anfänger-Themen 19
D java.util.Currency.getInstance exception mit brit. Pfund Java Basics - Anfänger-Themen 4
M Kann mir bitte jemand "java.util.ArrayList" erklären? Java Basics - Anfänger-Themen 5
V java.util.Stack Java Basics - Anfänger-Themen 9
J Java.Util.Properties wrapper class (Review Request) Java Basics - Anfänger-Themen 2
S BITTE UM HILFE HASHTABLE/import java.util.Hashtable in Ecplipse Java Basics - Anfänger-Themen 12
G DateFormat - Datumsformat java.util.Locale interpretieren Java Basics - Anfänger-Themen 2
? java.util.Properties Wert von key mehrfach vorhanden Java Basics - Anfänger-Themen 13
Q java.util.loggging neue datei erstellen Java Basics - Anfänger-Themen 3
L Exception in thread "main" java.util.NoSuchElement Java Basics - Anfänger-Themen 4
hedges Würfelwurf mit java.util.Random ohne 0 Java Basics - Anfänger-Themen 6
W Java.util.Map in Bean wandeln Java Basics - Anfänger-Themen 2
M java.util.Timer und geplante Abarbeitung Java Basics - Anfänger-Themen 2
U java.util.Date to java.sql.Date Java Basics - Anfänger-Themen 2
K Wer kann mir java.util.Hastable erklären. Java Basics - Anfänger-Themen 3
K Probleme mit java.util.hashtable Java Basics - Anfänger-Themen 10
K Zipfile erstellen mit java.util.zip.* Java Basics - Anfänger-Themen 2
J Eclipse und printf und import util.java.scanner; Java Basics - Anfänger-Themen 4
G java.util.LinkedList: Doppelte Elemente vermeiden Java Basics - Anfänger-Themen 5
K Prob mit java.util.regex.matches-String wird nicht erkannt? Java Basics - Anfänger-Themen 9
T Möchte Charwert 23C° mit java.util.Scanner einlesen macht Pr Java Basics - Anfänger-Themen 2
K java.util.Calendar und Objekt Java Basics - Anfänger-Themen 7
M Seltsames java.util.Date Problem Java Basics - Anfänger-Themen 6
M java.util.Scanner kann nicht aufgelöst werden - warum nicht? Java Basics - Anfänger-Themen 4
RaoulDuke java.util.Date parsen Java Basics - Anfänger-Themen 5
M Source Code von java.util.SubList Java Basics - Anfänger-Themen 2
ff java.util.date Java Basics - Anfänger-Themen 2
O reguläre Ausdrücke bei java.util.regex.Pattern Java Basics - Anfänger-Themen 4
K Keine weitere (java.util.)Scanner Eingabemöglichkeit? Java Basics - Anfänger-Themen 5
A wie implementiere ich java.util.Scanner? Java Basics - Anfänger-Themen 12
D Mit java.util.Arrays.sort die negativen Zahlen hinten Java Basics - Anfänger-Themen 4
C java.util.Timer und wait() oder so was Java Basics - Anfänger-Themen 3
G Leere java.util.List erzeugen Java Basics - Anfänger-Themen 2
S java.awt.List vs. java.util.List Java Basics - Anfänger-Themen 2
D dumme Frage! (was heist 'import java.util.*;' ?) Java Basics - Anfänger-Themen 3
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62

Ähnliche Java Themen

Neue Themen


Oben