Problem bei Quaxlis Tutorial(Nachtrag Teil1)

CelticWolf

Mitglied
Hallo!

Ich habe den ersten Teil von Quaxlis "Tutorial für Java Spiele" durchgearbeitet und das spiel funktioniert wie beschrieben. Doch erscheint während dem Spiel oft die Fehlermeldung Exception in thread "Thread-5" java.util.ConcurrentModificationException.
Soweit so gut, denn im Nachtrag wird auf dieses Problem eingegangen und eine Lösung nachgereicht.

Allerdings verstehe ich nicht so recht was ich genau ändern muss. Wenn ich die in der doLogic()-Methode dieForeach Schleife auskommentiere und und ersetze, dann wird der helikopter nicht ausgeblendet und die explosionsanimation loopt ständig.



hier der Lösungsvorschlag des Tutorials;
JavaConcurrentModificationException
Von Lesern dieses Tutorials wurde mir immer wieder berichtet, daß ihr Programm
eine JavaConcurrentModificationException wirft. Seltsamerweise tut das mein hier
gezeigtes Programm nicht, während ich den gleichen Effekt bei Programmen
beobachten kann, die mir zugesendet wurden.
Obwohl ich einige Zeit investiert habe, ist es mir bisher nicht gelungen den genauen
Unterschied heraus zu finden.
Nichtsdestotrotz möchte ich hier aber eine Lösung für das Problem nachreichen:
Der Fehler wird geworfen, wenn mehrere Threads (GameLoop- & „Fenster“-Thread)
gleichzeitig auf den Vector zugreifen bzw. wenn einer der beiden Threads etwas am
Vector ändert, während der andere auf die Objekte darin zugreift bwz. darüber
iteriert.
Zwar ist die Klasse Vector lt. API eigentlich thread-safe, das foreach-Konstrukt ist es
aber offensichtlich nicht.
Die Lösung des Problems besteht daher darin, die Art und Weise, mit der über den
Vector iteriert wird zu ändern.
Daher sollten alle Zugriffe, die über den Vector „nudeln“ wie folgt geändert werden:
Zeile 153 – 155: Die foreach-Schleife wird auskommentiert.
Zeile 157 – 159: Stattdessen iterieren wir selbst über die Objekte des Vectors. Das
Prinzip ist gleich geblieben, der Methodenaufruf prinzipiell auch, wir rufen diese nur
ein bisschen anders auf. 
Mit dieser Modifikation, angewendet auf alle foreach-Schleifen, sollte das Problem
dann erledigt sein. (Sobald ich herausbekomme, warum dies in meiner Version, bei
mir nicht geschieht, reiche ich die Lösung nach).



Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;



public class GamePanel extends JPanel implements Runnable, KeyListener, ActionListener{	
	private static final long serialVersionUID = 1L;
	boolean game_running = true;
	boolean started = false;
	boolean once = false;
	
	long delta = 0;
	long last = 0;
	long fps = 0;
	long gameover = 0;
	
	
	long timepass;
	int level = 1;
	int rdel = 1500;
	int x = 1;
	
	Heli copter;
	Vector<Sprite> actors;
	
	boolean up		= false;
	boolean down	= false;
	boolean left	= false;
	boolean right	= false;
	int speed = 200;
	
	Timer timer;
	Timer rtime;
	BufferedImage[] rocket;
	BufferedImage background;
	BufferedImage[] explosion;
	
	
	
	SoundLib slib;
	
	public static void main(String[] args){
		new GamePanel(1000,600);
	}
	
	
	
public GamePanel(int w, int h)
	{
		this.setPreferredSize(new Dimension(w, h));
		this.setBackground(Color.DARK_GRAY);
		JFrame frame = new JFrame("GameDemo");
		frame.setLocation(100,100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.addKeyListener(this);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);
		doInitializations();
	}
	
	private void doInitializations(){
		
		BufferedImage[] heli = this.loadPics("pics/heli.png", 4);
		rocket = loadPics("pics/rocket.gif",8);
		background = loadPics("pics/background.jpg",1)[0];
		explosion = loadPics("Pics/explosion.gif",5);
		
		slib = new SoundLib();
		slib.loadSound("heli","sound/heli.wav");
		slib.loadSound("bumm","sound/boom.wav");
		slib.loadSound("rocket", "sound/rocket_start.wav");
		
		
		last = System.nanoTime();
		gameover = 0;
		
		actors = new Vector<Sprite>();
		copter = new Heli(heli,400,300,100,this);
		actors.add(copter);
		
		if(isStarted()){
			slib.loopSound("heli");
		}
		
		createClouds();
		
		
		
		timer = new Timer(3000,this);
		timer.start();
		
		rtime = new Timer(10000,this);
		rtime.start();
		
		if(!once){
			once = true;
			Thread t = new Thread(this);
			t.start();
		}
	}
	
	
	private void createClouds(){
		
		BufferedImage[] ci = this.loadPics("pics/cloudr.png", 1);
	
		for(int y=10;y<getHeight();y+=50){
			int x = (int)(Math.random()*getWidth());
			Cloud cloud = new Cloud(ci,x,y,1000,this);
			actors.add(cloud);
		}
	
	}
	
	public void createExplosion(int x, int y){
		
		Explosion ex = new Explosion(explosion,x,y,100,this);
		actors.add(ex);
		slib.playSound("bumm");
		
		
	}
	

	
	public void run(){
		
		while(game_running){
			
			computeDelta();
			if(isStarted()){
			checkKeys();
			doLogic();
			moveObjects();
			
			
			}
			
			repaint ();
			
			try {
				Thread.sleep(10);
			}catch (InterruptedException e) {}
		
		}
	}

	private void checkKeys(){
		
		if(up){
			copter.setVerticalSpeed(-speed);
		}
		
		if(down){
			copter.setVerticalSpeed(speed);
		}
		
		if(right){
			copter.setHorizontalSpeed(speed);
		}
		
		if(left){
			copter.setHorizontalSpeed(-speed);
		}
		
		if(!up&&!down){
			copter.setVerticalSpeed(0);
		}
		
		if(!left&&!right){
			copter.setHorizontalSpeed(0);
		}
	}
	
	private void doLogic(){
		
		Vector<Sprite> trash = new Vector<Sprite>();
	
		
		
		/*for(Movable mov:actors){
			mov.doLogic(delta);
			Sprite check = (Sprite)mov;
			if(check.remove){
				trash.add(check);
			}
		}
		
		*/
			
		
		for(int i = 0;i < actors.size();i++){
			actors.get(i).doLogic(delta);
			Sprite check = (Sprite)actors.get(i);
			if(check.remove){
				trash.add(check);
			}
			for(int n = i+1; n<actors.size();n++){
				Sprite s1 = actors.elementAt(i);
				Sprite s2 = actors.elementAt(n);
				s1.collidedWith(s2);
				
			}
			
		}
		
		if(trash.size()>0){
			for(Sprite s: trash){
				trash.clear();
			}
		}
		if(gameover>0){
			
			if(System.currentTimeMillis()-gameover>3000){
				stopGame();
			}
		}
		
	}
	
	private void stopGame(){
		timer.stop();
		rtime.stop();
		slib.stopLoopingSound();
		setStarted(false);
		
	}

	private void moveObjects(){
		for(Movable mov:actors){
			mov.move(delta);
			}
		
		
	}
	
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		g.drawImage(background, 0, 0, this);
	
		g.setColor(Color.white);
		g.setFont( new Font( "Trebuchet MS", Font.BOLD, 12 ) );
		g.drawString("FPS: " + Long.toString(fps), 20, 10);
		g.drawString("Level  " + level, 750, 10);
		
		if(!isStarted()){
			return;
		}
		
		if(actors !=null){
			for(Drawable draw:actors){
				draw.drawObjects(g);
			}
		}
	}
	
	private void computeDelta(){
		
		delta = System.nanoTime() - last;
		last = System.nanoTime();
		
		fps = ((long) 1e9)/delta;
	}
	
	
	private BufferedImage[] loadPics(String path, int pics){
		
		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;
		
		URL pic_url = getClass().getClassLoader().getResource(path);
		
		try{
			source = ImageIO.read(pic_url);
			} catch (IOException e) {}
			
			for(int x=0;x<pics;x++){
				anim[x] = source.getSubimage(x*source.getWidth()/pics, 0, 
						source.getWidth()/pics, source.getHeight());
			}
			
			return anim;
	}
	
	public boolean isStarted() {
		return started;
	}
	
	public void setStarted(boolean started) {
		this.started = started;
	}


	
private void createRocket(){
		
		int x = 0;
		int y = (int)(Math.random()*getHeight());
		int hori = (int)(Math.random()*2);
		
		if(hori==0){
			x = -30;
		}else{
			x = getWidth()+30;
		}
		
		
		Rocket rock = new Rocket(rocket,x,y,100,this);
		if(x<0){
			rock.setHorizontalSpeed(300);
		}else{
			rock.setHorizontalSpeed(-300);
		}
		actors.add(rock);
		//slib.playSound("rocket");
		
	}




	
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()==KeyEvent.VK_UP){
			up		=	true;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down	=	true;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left	=	true;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right = true;
		}

	}
	
	
	
	public void keyTyped(KeyEvent e) {
		
	
		
	}


	public void keyReleased(KeyEvent e) {
		
		if(e.getKeyCode()==KeyEvent.VK_UP){
			up		=	false;
		}
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down	=	false;
		}
		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left	=	false;
		}
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right	=	false;
		}
		if(e.getKeyCode()==KeyEvent.VK_ENTER){
			if(!isStarted()){
				doInitializations();
				setStarted(true);
				level = 1;
			}
		}
		if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
			if(isStarted()){
				stopGame();
			}else{
				setStarted(false);
				System.exit(0);
			}
		}
		
		
		}
	public void actionPerformed(ActionEvent e){
	
		if(isStarted() && e.getSource().equals(timer)){
			createRocket();
		}
		if(isStarted() && e.getSource().equals(rtime)){
			level++;
			timer.setDelay(3000/level);
		}
	
		
	}
	
	}
 

Runtime

Top Contributor
Nimm anstatt eines Vektors eine CopyOnWriteArrayList.
Edit:
Die ConcurrentModificationException wird geworfen, wenn über die List iteriert und zugleich die List geändert wird.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
@Quaxli: Ich finde es schade, dass DAS Spieletutorial hier aus dem Forum so einen Flaw hat. Falls du mal dazu kommst, das ganze nach dem letzten Stand zu einer kompletten (z.B. Eclipse-importierbaren) ZIP zusammenzupacken (vielleicht mit einer Änderung, wo das Problem auftritt) würde ich versuchen, mal die Zeit zu finden, dem nachzugehen, so dass ggf. auch der Text angepasst werden könnte, und das nicht mit so einem "Nachtrag" ausgebügelt werden müßte...
 

CelticWolf

Mitglied
Hmm aber wie erstellt man so eine CopyOnWriteArrayList??

im Nachtrag stehen noch folgende Zeilen: (Bei mir ist die Methode doLogic() auf zeile 182)
Java:
private void doLogic(){

 /*for (Movable mov:actors) {
 mov.doLogic(delta);
}*/

for(int i=0;i<actors.size() ; i++) {   //neu eingefügt
actors.get(i).doLogic(delta);
}

if (time == 300) {
createRocket();
time= 0;
}else {
time++;
}
}

doch die ist anders als die do l
 

CelticWolf

Mitglied
Hmm aber wie erstellt man so eine CopyOnWriteArrayList??

im Nachtrag stehen noch folgende Zeilen: (Bei mir ist die Methode doLogic() auf zeile 182)
Java:
private void doLogic(){

 /*for (Movable mov:actors) {
 mov.doLogic(delta);
}*/

for(int i=0;i<actors.size() ; i++) {   //neu eingefügt
actors.get(i).doLogic(delta); //neu eingefügt
} //neu eingefügt

if (time == 300) {
createRocket();
time= 0;
}else {
time++;
}
}

Doch die ist anders als die doLogic Methode von mir.
Bei mir und gemäss der Anleitung sieht der Code so aus

Java:
private void doLogic(){
		
Vector<Sprite> trash = new Vector<Sprite>();
		
		for(Movable mov:actors){
			mov.doLogic(delta);
			Sprite check = (Sprite)mov;
			if(check.remove){
				trash.add(check);
			}
		}

		
		
		for(int i = 0;i < actors.size();i++){
      for(int n = i+1; n<actors.size(); n++){
    
         Sprite s1 = actors.elementAt(i);
         Sprite s2 = actors.elementAt(n);
         
         s1.collidedWith(s2);
				
			}
			
		}


wie muss ich diesen teil nun anpassen?

und muss man sonst auch noch etwas verändern?
 

Runtime

Top Contributor
Es sollte reichen, wenn du den Typ des Vectors, der die Exception ausgelöst hat in CopyOnWriteArrayList änderst. Die ist gleich zu bedienen wie ein Vectorobjekt.
 

CelticWolf

Mitglied
Ich habe den Code nun geändert und das Spiel funktioniert. Allerdings kommen während dem Spiel (nicht von Anfang an, aber spätestens bei einer Kollision mit einer Bombe) folgende Fehlermeldungen:

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at GamePanel.paintComponent(GamePanel.java:268)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at GamePanel.paintComponent(GamePanel.java:268)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at GamePanel.paintComponent(GamePanel.java:268)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at GamePanel.paintComponent(GamePanel.java:268)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at GamePanel.paintComponent(GamePanel.java:268)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at GamePanel.paintComponent(GamePanel.java:268)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at GamePanel.paintComponent(GamePanel.java:268)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at GamePanel.paintComponent(GamePanel.java:268)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)



Der Geänderte Code sieht so aus:

Java:
private void doLogic(){
		
Vector<Sprite> trash = new Vector<Sprite>();
		
	/*	for(Movable mov:actors){
			mov.doLogic(delta);
			Sprite check = (Sprite)mov;
			if(check.remove){
				trash.add(check);
			}
		}

		*/
for(int i=0;i<actors.size() ; i++) { 
	actors.get(i).doLogic(delta);
	Sprite check = (Sprite)actors.get(i);
	if(check.remove){
		trash.add(check);
	}
	}

Java:
	private void moveObjects(){
		/*for(Movable mov:actors){
			mov.move(delta);
			}
		*/
		
		for(int i=0;i<actors.size() ; i++) {  
			actors.get(i).move(delta);     
			}
		
	}
 

ThreadPool

Bekanntes Mitglied
Poste doch den Code wo der Fehler aufgetreten ist, und zwar in GamePanel in Zeile 268. Da wird sicher noch irgendwie ein Iterator über eine synchronisierte Collection verwendet.
 

CelticWolf

Mitglied
Dankee !
Nun funktioniert das Spiel einwandfrei !

Ich habe nun den Drawable Vektor auf Zeile 268 auch in eine CopyOnWriteArrayList umgewandelt. Habe den völlig übersehen.

Hier sind nochmals alle Codezeilen die geändert werden müssen um das Problem zu beheben:


Java:
private void doLogic(){
		
Vector<Sprite> trash = new Vector<Sprite>();
		
	/*	for(Movable mov:actors){
			mov.doLogic(delta);
			Sprite check = (Sprite)mov;
			if(check.remove){
				trash.add(check);
			}
		}

		*/
for(int i=0;i<actors.size() ; i++) { 
	actors.get(i).doLogic(delta);
	Sprite check = (Sprite)actors.get(i);
	if(check.remove){
		trash.add(check);
	}
	}

Java:
private void moveObjects(){
		/*for(Movable mov:actors){
			mov.move(delta);
			}
		*/
		
		for(int i=0;i<actors.size() ; i++) {  
			actors.get(i).move(delta);     
			}
		
	}

Java:
if(actors !=null){
			/*for(Drawable draw:actors){
				draw.drawObjects(g);
			} */
			
			for(int i=0;i<actors.size();i++){
				actors.get(i).drawObjects(g);
			}
			
			
		}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Best Practice Problem mit (einfacher) Doppelt-Schleife Java Basics - Anfänger-Themen 53
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2
J Klassen Problem Java Basics - Anfänger-Themen 8
A Out.format problem. Java Basics - Anfänger-Themen 3
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
A Array problem Java Basics - Anfänger-Themen 16
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Ich habe ein Problem Java Basics - Anfänger-Themen 3
A Problem bei returnen eines Wertes Java Basics - Anfänger-Themen 6
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
D Input/Output Problem bei der Benutzereingabe eines Befehls Java Basics - Anfänger-Themen 14
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
C Regex-Problem Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
W Wo ist das URL-Problem ? Java Basics - Anfänger-Themen 1
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
D FileWriter / FileReader Problem Java Basics - Anfänger-Themen 10
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
C Problem mit If Else If und Überprüfung eines Counters Java Basics - Anfänger-Themen 3
F Problem mit Listen Java Basics - Anfänger-Themen 5
I wieder mit einer Umwandelung habe ich Problem (diesmal von char Array zu char) Java Basics - Anfänger-Themen 1
J Problem bei Umrechnung von Hex in Bin Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben