Game of Life Implementierung

Klumpenmann

Mitglied
in dem folgenden Stück Code bekomme ich eine null Pointer Exception in der Zeile: this.currentGeneration[j] = new MyLifeForm(false);

also ist currentGeneration = null ??? Eigentlich will ich diese ja auch füllen. Aber naja vielleicht erkennt jemand hier ja einen Fehler, obwohl ich eher denke das der Fehler anderswo im Programm liegt... :bahnhof:

Java:
public boolean setPopulation(Population population) {
		
		this.popName = population.getDescription();
		
		this.currentGeneration = new MyLifeForm[this.currentUniverse.getNumberOfRows()]
		                                        [this.currentUniverse.getNumberOfColumns()];
		
		boolean[][]currentPop = population.getLifeFormMatrix();
		
		int popColumns = currentPop.length;
		int popRows = currentPop[0].length;
		
		int UniRows = this.getUniverse().getNumberOfRows();
		int UniColumns = this.getUniverse().getNumberOfColumns();
		boolean match = true;
		
		for (int i = 0; i<UniRows; i++){
			for (int j = 0; i<UniColumns; j++) {
				if (i < popRows 
						&& j < popColumns) {
					this.currentGeneration[i][j] = new MyLifeForm (currentPop [i][j]);
				} else {
					match = false;
					this.currentGeneration[i][j] = new MyLifeForm(false);
				    
				}
			}
		}
		
		
		return match;
	}
 
Zuletzt bearbeitet von einem Moderator:
Habs mir mal angeguckt... beim nächsten Mal wäre es ganz nett, eine kurze Beschreibung dazuzulegen, wie das halbfertige Programm zu bedienen ist, damit man überhaupt zu diesem Fehler kommt.
Nachdem ich gut geraten (und im Code nachgeguckt) hab, tritt dieser Fehler wohl bei Spiel -> Start auf?!

currentGeneration ist tatsächlich null und wird erst gesetzt, wenn MyAbstractLifeRuntime.setBoard(...) aufgerufen wird. Das würde wahrscheinlich auch klappen, wenn vorher ein Spielbrett geladen wird, wo irgendwo eine Instanz des Interfaces "Universe" auch einen Wert für getBoard() zurückliefern würde. MyUniverse scheint wohl diese Instanz zu sein, die auch in dieser Hinsicht korrekt programmiert ist, aber es fehlt dann doch vielleicht in der Klasse MyLifeIO eine oder auch mehrere Zeilen, die das "Board" auch mit einer Instanz füllen.
Um es etwas einfacher zu sagen: die Klasse MyUniverse beinhaltet die Klassenvariable "Board", auf die letztendlich zurückgegriffen wird, um später currentGeneration die Instanz bzw. das Array zu übergeben. Die Klassenvariable "Board" bekommt aber nie eine Instanz und bleibt immer null (einziger Call bzw. einziges Setzen dieser Variable erfolgt im passenden Setter der gleichen Klasse, der Setter wird nie aufgerufen, Variable ist privat => bleibt immer null).
Die Lösung des Problems ist wohl, "Board" eine Instanz zuzuweisen. MyLifeIO setzt einiges in der Universe bzw. MyUniverse-Instanz, vielleicht kann man hier noch die passende Information aus der Datei laden? Oder wenn die Population geladen wird? Keine Ahnung, soweit habe ich dann doch noch nicht euren Code nachvollzogen.

Ich hoffe, ihr könnt was damit anfangen, ansonsten noch mal nachfragen 😉
 
Schonmal danke für die Antwort! Kann deinen Beitrag gerade noch nicht direkt nachvollziehen, weil ich auf der Arbeit bin und das Programm nicht vor mir habe.
Also bei mir ist es so das ich Spielbretter (boards) laden kann... wenn ich dann allerding eine Population laden will tritt der Fehler auf. Erst nach dem Laden des Spielbrettet und der Population würde man auf Start drücken um die nächste Generation zu erzeugen.
Also ist es kein Problem mit der Klassenvariable Board sondern nur mit dem laden von Populationen oder? Das liegt wohl auch nur daran das currentGeneration bzw die MyLifeForm Matrix = null ist... :bahnhof: Bin halt an dem Punkt angekommen wo ich echt keine Ahnung mehr habe wo der Fehler liegen könnte. Wäre cool wenn ihr hier noch paar Vorschläge hättet.
 
Was soll currentGeneration denn enthalten? Das Problem liegt darin, dass dieser Variable in deinem Code keine Instanz zugewiesen wird und demnach immer null ist.
Bin ebenfalls noch auf der Arbeit, werde aber nachher (ca. 2 Stunden) noch mal das Problem nachvollziehen, wenn ich erst ein Board und dann die Population lade (wenn ich das jetzt richtig verstanden hab?).

Darf ich nebenher fragen, was das für ein Kurs ist? 🙂
 
Java Kurs in Informationsverarbeitung Bachelor Uni Köln.
In Zeile 21 im geposteten Stück Code wird doch currentGeneration eigentlich die übergebene Population übergeben,
dachte ich zumindest...
 
Ah danke 😉
In dieser Zeile wird auf ein Feld in einem Array zugegriffen, dafür muss aber irgendwann vorher ein entsprechendes zweidimensionales Array initialisiert und zugewiesen worden sein.

Edit: hatte irgendwie überlesen gehabt, dass es sich um eine Array-Variable handelt. In Zeile 21 willst du tatsächlich eine Instanz der current-Variable zuweisen, das geht aber nicht, da das entsprechende Array dazu noch nicht initialisiert wurde.
 
Zuletzt bearbeitet:
da geb ich dir recht 😀 sorry, hab da noch irgendeine andere Klasse im Kopf gehabt. Bevor ich noch mehr Unsinn quatsche, guck ich mir das gleich zu Hause noch mal an.
 
So, habs noch mal getestet. Das Programm habe ich wie folgt bedient:

Application.main(...) gestartet. Datei -> Spielbrett laden -> weltall.gol ausgewählt (Hintergrund erscheint). Datei -> Population laden -> figures.golp ausgewählt.
Da bekomm ich zwar auch eine NPE, aber an einer anderen Stelle: LifePanel.setPopulation() in der ersten Zeile der Methode (Zeile 46 in der Klasse). newPopulation ist an dieser Stelle null.

Oder habe ich da wieder was falsch bedient?

(omg, doppelpost, sorry...)
 
Ja das heisst ja das die LifeFormMatrix = null ist und diese wird ja eigentlich in setPopulation befüllt. Also dein Problem ist genau das was ich habe Vollkommen richtig! Das laden einer Population klappt halt nicht. Verzweiflung pur! ;(
 
Hilft es dir vielleicht weiter, dass Zeile 5 und 6 aus deinem Code-Beispiel des ersten Posts in der Klasse MyAbstractLifeRuntime gar nicht vorhanden sind? Da sind noch ein paar weitere Unterschiede... füge ich die Array-Initialisierung ein, bekomm ich immerhin einen anderen Fehler 😉
 
Hmm ja hatte ich wohl noch nicht in der geuploadeten Datei eingefügt, aber soweit war ich auch schon.
Ich hab langsam das gefühl ich müsste das alles nochmal von vorne programmieren, aber dazu fehlt mir die Zeit. Gibts hier den niemanden sonst der noch Rat weiss? Ich würd mich auch erkenntlich zeigen xD
 
vielleicht würde es helfen, wenn du kurz beschreibst, was beim Laden der Population passiere soll. Habs mir grade mal auf der Arbeit geladen, deine aktualisierte Methode aus dem ersten Post reinkopiert und sehe, dass du noch mehr Veränderungen durchgeführt hast, zumindest sind wohl zwei Konstruktoren in der MyLifeForm-Klasse hinzugekommen.
Wenn du hier die Änderungen posten würdest, könnte man den Fehler vielleicht eher nachvollziehen, immerhin scheint es jetzt auch ein anderer zu sein.
 
Sooo blond bin nicht mal ich ;-) - nach 75 Sekunden kam die Aufforderung etwas hochzuladen oder sich einzuloggen - reproduzierbar - bis ich auf die schräge Idee kam den popupblocker auszuschalten - dann gehts.
 
Problem Nr1: LifePanel - setPopulation wird mit null aufgerufen wenn man eine random Population erzeugen will...

Aufruf erfolgt aus dem LifeFrame setNextGeneration .. aber da kannst du ja selbst suchen auf jeden Fall ist das nicht instanziert.

Und das Panel verhält sich auch mehr als seltsam wenn es noch leer ist - fahr mal mit der Maus darüber ;-)
 
Zuletzt bearbeitet:
Fehler gefunden - wie so oft einfach nur trivial. Du wolltest dich erkenntlich zeigen, was bekomm ich denn? 😀

naja, ich will mal nicht so sein... Zeile 118, die zweite for-schleife. In der Bedingung sollte ein j und nicht ein i stehen, dann läuft immerhin das Laden der Populationen 😉

Bekomm ich ein Geschenk oder willst du mir was überweisen? Dann schick ich dir entweder meine Adresse, Kontoverbindung oder auch Paypal-Adresse 😛

Edit: nächster Fehler: in der Bedingung
[Java]if (i < popColumns && j < popRows ) {[/Java]
haben popColumns und popRows den Platz getauscht, damit sollte es auch nicht nur für die erste Population in der Liste klappen 😉
 
Zuletzt bearbeitet:
Oh Mann! und ich dachte ich hätte das noch kontrolliert... -.-
Naja aufjedenfall geil... ich kann Populationen laden...
Jetzt kommt aber direkt die nächste Exception wenn man die nächste Generation erzeugen will... Muss ich halt mal schauen.

Mich armen Studenten willst du ausnehmen? xD Erstmal schauen ob ich das Programm komplett zum laufen kriege dann lässt sich über sowas nochmal reden ^^
 
ich bin selber Student und weiß wie das ist 😉 war ja auch nur Spaß...

da ich noch nicht so hinter die Bedienung (vom Sinn ganz zu schweigen) deines Programm hintergekommen bin: was muss ich wie klicken, um zu deiner Exception zu kommen?
 
Also am besten spielbrett laden... weltraum.... pop laden.... gun .... und dann auf Spiel -> Nächste Generation....

Hat wohl irgendwas damit das die lifeForm null ist... also auch copy und ebenso currentGeneration wieder null?.... irgendwie sowas....
 
Hi,

das hat was mit folgender Methode in der Klasse "MyLifeForm" zu tun:
[Java]public LifeForm createCopy() {
return null;
}[/Java]

Ich kann wieder nur raten, aber: hier sollte vielleicht eine Kopie der Instanz zurückgegeben werden und nicht null 😉
 
Immerdoch gerne... am Ende muss ich dir man ganzes erspartes geben xD.
Bin gerade erstmal damit beschäftigt die Dokumentation zu schreiben.... das muss ich bis morgen 12 alles abgeben deswegen leg ich damit gerade schonmal los... ^^
 

Zurück
Oben