Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 21:50

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Exception beim löschen verhindern ?

Discussion on Exception beim löschen verhindern ? within the General Coding forum part of the Coders Den category.

Reply
 
Old   #1

 
xEncounter's Avatar
 
elite*gold: 22
Join Date: Nov 2009
Posts: 1,552
Received Thanks: 361
Exception beim löschen verhindern ?

Code:
import java.util.ArrayList;

import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;

public class Cardrive extends BasicGame {

	private Image bg; // Attribut für das Hintergrundbild
	private ArrayList<Car> autos = new ArrayList<Car>(); 

															
	private Player player; // Der Spieler

	private int neuesAutoTimer = 0;
	private boolean gameOver = false; // Die GameOver Variable
	private Input input; // Spieler Input

	@Override
	public void init(GameContainer gc) throws SlickException {
		bg = new Image("bg.png"); 
		player = new Player(gc.getInput()); 
		input = gc.getInput();
	}

	@Override
	public void update(GameContainer gc, int delta) throws SlickException {

		neuesAutoTimer += delta;

		player.bewegen(delta);

		if (neuesAutoTimer >= 750 && gameOver == false) {

			autos.add(new Car((int) (Math.random() * (2 - 0) + 0)));

			neuesAutoTimer = 0;

		}

		for (Car auto_now : autos) {
			auto_now.bewegen(delta);
		}

		if (autos.size() > 0 ) {

			for (Car auto_now : autos) {
				if (player.getHitbox().intersects(auto_now.getHitbox())) {

					autos.remove(auto_now);

					gameOver = true;

				}
			}
		}

		if (input.isKeyPressed(Input.KEY_ENTER) && gameOver == true) {

			autos.clear();
			neuesAutoTimer = 0;
			gameOver = false;

		}

	}

	@Override
	public void render(GameContainer gc, Graphics gfx) throws SlickException {

		// Der Hintergrund wird gezeichnet
		bg.draw();

		// Alle Autos in der Liste werden gezeichnet
		for (int i = 0; i < autos.size(); i++) {
			Car auto = autos.get(i);
			auto.zeichnen();
			gfx.draw(auto.getHitbox());
		}

		// Den Spieler mit der Hitbox zeichen
		player.zeichnen();
		gfx.draw(player.getHitbox());

		// Anzeige für den momentanen delta-Wert
		gfx.drawString("delta: " + neuesAutoTimer, 25, 50);

		// Anzeige für die momentanen Autos auf dem Bildschirm
		gfx.drawString("Autos: " + autos.size(), 25, 75);

		// Gameover anzeigen
		if (gameOver) {
			gfx.setColor(Color.red);
			gfx.drawString(
					"Du hast verloren!! \nDrücke Enter für einen Neustart!",
					200, 300);
		} else {
			gfx.setColor(Color.white);
		}
	}

	public Cardrive(String title) {
		super(title);

	}

	public static void main(String[] args) throws SlickException {
		AppGameContainer myGame = new AppGameContainer(
				new Cardrive("Car Drive"));
		myGame.setDisplayMode(600, 800, false);

		myGame.start();
	}

}
Irgendwo ist da ein Fehler in der Spielelogik...


Sobald man das erste Auto trifft, ist Game Over. Soweit so gut.

Dann hören die Autos auf zu spawnen(auch gut), dann läuft man absichtlich in das letzte Auto(auch noch okay), dabei crasht das Spiel mit einer Exception(nicht gut).

Hier die detaillierte Ausgabe:
Code:
Sun Jan 11 14:11:15 CET 2015 ERROR:null
java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)
	at Cardrive.update(Cardrive.java:64)
	at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:663)
	at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
	at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
	at Cardrive.main(Cardrive.java:129)
Sun Jan 11 14:11:15 CET 2015 ERROR:Game.update() failure - check the game code.
org.newdawn.slick.SlickException: Game.update() failure - check the game code.
	at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:669)
	at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
	at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
	at Cardrive.main(Cardrive.java:129)
xEncounter is offline  
Old 01/11/2015, 14:35   #2
 
xXKonaXx's Avatar
 
elite*gold: 20
Join Date: Nov 2010
Posts: 552
Received Thanks: 350
Benutze einen Iterator um durch die Objekte zu gehen.
xXKonaXx is offline  
Thanks
1 User
Old 01/11/2015, 14:48   #3

 
xEncounter's Avatar
 
elite*gold: 22
Join Date: Nov 2009
Posts: 1,552
Received Thanks: 361
Was genau ist ein Iterator und wie kann ich ihn implementieren ?

Beispiel gerne gesehen ^^
xEncounter is offline  
Old 01/11/2015, 14:58   #4
 
elite*gold: 0
Join Date: Jan 2012
Posts: 759
Received Thanks: 416
Was? , Folie 20f

Wie?
Code:
Iterator<E> it = list.iterator();
while (it.hasNext()) { E obj = it.next(); }
dowhile is offline  
Old 01/11/2015, 15:03   #5

 
xEncounter's Avatar
 
elite*gold: 22
Join Date: Nov 2009
Posts: 1,552
Received Thanks: 361
Also soweit ich den Code verstehe, geht dieser Iterator soweit alle Elemente in der Liste durch solange es ein nächstes Element hat ?

Kann man dieses Iterator zum jeweiligen Element "returnen" oder was ist die Aufgabe des Iterators ?
xEncounter is offline  
Old 01/11/2015, 15:08   #6
 
elite*gold: 1202
Join Date: Dec 2014
Posts: 43
Received Thanks: 5
Statt
Code:
for (Car auto_now : autos) {
	if (player.getHitbox().intersects(auto_now.getHitbox())) {
           autos.remove(auto_now);
           gameOver = true;
        }
}
Würdest Du schreiben:

Code:
Iterator<Car> it = autos.iterator();
while (it.hasNext()) {
   Car auto_now = it.next();
   if (player.getHitbox().intersects(auto_now.getHitbox())) {
       it.remove();
       gameOver = true;
   }
}
Siehe:
Der Unterschied ist, dass Du hier mit it.remove() ein Element aus der Liste löschen kannst, ohne dass eine ConcurrentModificationException geworfen wird.
ConcurrentModificationException bedeutet ja, dass mehrere gleichzeitige Operationen auf der Liste ausgeführt werden, die dazu führen können, dass das was passiert mehr oder weniger zufällig ist (jedenfalls nicht eindeutig definiert). In diesem Fall iterierst Du über alle Elemente der Liste, entfernst dabei allerdings Elemente. Jetzt ist nicht definiert, ob Du zum Beispiel ein Element entfernt hast, über das Du schon iteriert hast oder erst noch iterieren wirst, deshalb verwendet man dort dann einen Iterator, der nur das aktuelle Element entfernen kann.
Anzumerken ist auch, dass nicht alle Arten von Collections remove() bei einem Iterator unterstützen. Interessant ist manchmal auch ein ListIterator, je nach Einsatz.
SteMu82 is offline  
Thanks
2 Users
Old 01/11/2015, 15:13   #7

 
xEncounter's Avatar
 
elite*gold: 22
Join Date: Nov 2009
Posts: 1,552
Received Thanks: 361
Das ist etwas, was ich verstehe.

Jetzt leuchtet mir die Funktion des Itertators auch ein.

Danke !

#closerequest
xEncounter is offline  
Old 01/11/2015, 15:17   #8
 
elite*gold: 1202
Join Date: Dec 2014
Posts: 43
Received Thanks: 5
Habe noch eine mehr oder weniger umgangssprachliche und vereinfachte Erklärung hinzugefügt. Viele wollen ja auch verstehen, was sie machen und warum
SteMu82 is offline  
Old 01/11/2015, 15:36   #9

 
xEncounter's Avatar
 
elite*gold: 22
Join Date: Nov 2009
Posts: 1,552
Received Thanks: 361
Natürlich ist es mir wichtig zu verstehen wie man so etwas anwendet und wie so etwas funktioniert, nur wenn mir jemand Dokus aus irgendeiner Uni oder was weiß ich postet ist der Verstehen-Effekt = 0.

Daher danke ich dir für die Erklärung.
xEncounter is offline  
Old 01/11/2015, 16:46   #10
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,227
Du musst aufpassen wenn du Iterator nach der oben beschriebenen Weise verwendest, und zwar falls man durch iterriert, befindet man sich dann an letzter Stelle. Leider liefert der Iterator aus der Java SDK kein zurückspringen auf die erste Stelle einer Liste/Map/whatever wie der Iterator zB aus dem MySql-Connector lib.

Bei jeder neuen durch iterrierung musst du wieder auf die erste Stelle gehen, leider musst du in diesem fall jetzt zurück iterrieren und das kostet Zeit.

Deswegen rate ich dir in einer for-Schleife durch zu iterrieren weil du da kein solches Problem haben würdest, da es nur in der for-Schleife gültig ist(der Iterator).

Code:
for(Iterator<Car> it = autos.iterator(); it.hasNext(); ) {
    Car auto_now = it.next();
    if (player.getHitbox().intersects(auto_now.getHitbox())) {
        it.remove();
        gameOver = true;
    }
}
XxharCs is offline  
Thanks
2 Users
Old 01/12/2015, 04:08   #11
 
elite*gold: 1202
Join Date: Dec 2014
Posts: 43
Received Thanks: 5
Sehe da jetzt ehrlich gesagt keinen Unterschied oder verstehe die Erklärung nicht.
Der Iterator wird ja nicht mehrfach verwendet und verliert ja davon abgesehen nach jedem Aufruf der "update"-Methode seine Gültigkeit.
autos.iterator() gibt bei jedem Aufruf einen neuen Iterator zurück (wäre auch schlimm wenn nicht) und wenn man wieder von vorne anfangen will, reicht es auch einfach sich damit einen neuen Iterator zu holen.

Oder meintest Du allgemein? Da gilt das natürlich, da bei jedem Aufruf von next() der Iterator auch eins weiter läuft. Allerdings habe ich noch nicht gesehen, dass jemand zwei Mal direkt hintereinander über die gleiche Liste iteriert und es Sinn machen würde den selben Iterator zu verwenden.

Wenn man dazu neigt solche komischen Dinge zu tun oder es einfach nicht weiß, ist die vorgeschlagene Alternative natürlich sinnvoll, weil sie es einfach garnicht ermöglicht ihn danach nochmal zu verwenden. Hatte ich persönlich so allerdings noch nie gesehen und auch noch keinen Fall, in dem es einen Unterschied machen würde.

Wenn ich also irgendwas übersehen habe, sag bitte bescheid. Lerne immer gerne dazu.
SteMu82 is offline  
Reply


Similar Threads Similar Threads
[Howto] Toiletten Spritzen beim Scheissen verhindern!
04/14/2012 - Tutorials - 4 Replies
Hallöchen, Ihr kenn warsch dies: http://i0.kym-cdn.com/photos/images/original/000/ 125/846/6-things-you-hate-1219911977776.jpg?130612 0444 Heute erkläre ich euch wie ihr dies verhindern könnt trololol.... Ihr müsst einfach zuerst ein stück toiletten papier in die toilette werfen, sodass dies oben auf dem wasser schwimmt...
[How to]Rukkeln/Laggen beim Zocken verhindern
03/29/2010 - Tutorials - 3 Replies
Hallo Leute, Bei sehr vielen Leuten hängen Spiele weil sie ein schwachen Computer haben oder anderes Hier eure Lösung How to: 1.Bevor ihr euer Spiel startet schließt alle unnötigen Programme (Skype,MSN,Ts²,Icq,etc.) 2.Pc öffnen und die Lüftung eures PC´s reinigen (macht den PC noch schneller)
Wie kann ich verhindern das dekaron beim minimieren abstürzT?
02/18/2010 - Dekaron - 1 Replies
ich hab ein prob.nähmlich immer wenn ich dekaron minimiere schliest es weis wer wie ich das verhindern kann ohne das ich es in ein fenster machen muss?
Wie kann ich verhindern das dekaron beim minimieren abstürzT?
02/18/2010 - Dekaron - 0 Replies
ich hab ein prob.nähmlich immer wenn ich dekaron minimiere schliest es weis wer wie ich das verhindern kann ohne das ich es in ein fenster machen muss?
Patch beim Einloggen verhindern
02/02/2009 - World of Warcraft - 4 Replies
Hi, ich habe (nach einer langen Pause) wieder angefangen WoW auf einen PServer zu Spielen... Da die Patchversion mit der auf dem entsprechenden Server übereinstimmen muss habe ich alles versucht die Auto-Patchs zu verhindern. Ich Starte WoW mit WoW.exe, aber wenn ich mich Einloggen will, versucht es wieder zu Patchen. Screen: http://img145.imageshack.us/img145/17/patcherford erlichfh5.th.png



All times are GMT +2. The time now is 21:50.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.