NullPointerExceptions bei Objekt array

  • Themenstarter Themenstarter lehmi
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
L

lehmi

Gast
Hallo,

ich habe eine kleines Problem mit einem Array aus Objekten.

Hier erstmal die Klasse, wo die Exception auftritt

Zeile this.nodeArray= null; // Knotenliste "löschen"

Ist sicher unnötig, aber wenn ich das auskommentiere dann tritt der Fehler auch in addNode(Node node) auf bei this.nodeArray[this.nodeCount]= node;

Der gleiche Fehler kommt auch beim Zugriff auf adjmatrix.... ist aber bestimmt das gleiche Problem.

Code:
class Graph {

	//Hier benötigte Attribute der Klasse einfügen (private!).
	private int maxNodes=0;
	private int nodeCount=0;
	
	private Edge[][] adjmatrix;
	private Node[] nodeArray;

	/* Initialisiert den Graph fuer maximal maxNodes Knoten. */
	Graph(int maxNodes) {
		//Hier implementieren.		
		this.maxNodes=maxNodes; 
		
		Edge[][] adjmatrix = new Edge[maxNodes][maxNodes]; // neue Adjazenzmatrix anlegen
		Node[] nodeArray = new Node[maxNodes]; // neuer Array für die Knoten  

		for (int i=0; i< maxNodes; i++) {
		  this.nodeArray[i]= null; // Knotenliste "löschen"  <---------------------hier
		  for (int j=0; j<maxNodes; j++) {
		      this.adjmatrix[i][j] = new Edge(99999999); //Adjanzenzmatrix löschen <---------------------auch hier
		  } // for j
		} //for i
		
	} //Graph

	/* Fuegt den Knoten node in den Graphen ein. */
	void addNode(Node node) {
		if (this.nodeCount<maxNodes) { // mehr Knoten als initialisiert ?
		  this.nodeArray[this.nodeCount]= node; <-----------------hier 
		  Edge e = new Edge(0); // Nodes haben sich selbst als Nachbarn
		  this.adjmatrix[this.nodeCount][this.nodeCount]= e; <-------------------auch hier
		  this.nodeCount++;
		} //if
	} //addnode

Hier der Teil aus dem Hauptprogramm

Code:
		Graph graph = new Graph(24);
		Node node0 = new Node("Hurra");

                graph.addNode(node0);

graph.addNode(node0); Hier wirft er wieder eine Exception aus

Code:
class Node implements Comparable {

	/* Der Name dieses Knotens. */
	String name;

	/*
	 * Dieses Attribut wird von der Klasse Graph verwaltet. Bitte nicht von Hand
	 * aendern.
	 */
	int index = -1;

	/* Initialisiert den Knoten mit dem gegebenen Namen. */
	Node(String n) {
		this.name = n;
	}

	/* Vergleicht den aktuellen Knoten mit O. */
	public int compareTo(Object o) {
		return this.name.compareTo(((Node) o).name);
	}

	public String toString() {
		return "<Node: " + this.name + ">";
	}
}


Ich dachte, es reicht den Array zu initialisieren, aber ich habe wohl irgendwas falsch verstanden..

Kann mir jemand vielleicht einen Tip geben ?
 
Naja, ich dachte, das würde so reichen. Immerhin wird ja das Objekt node0 richtig erzeugt, die Zuweisung schlägt aber fehl... Wie kann ich denn die Objekte für das Array richtig erzeugen ?
 
Code:
nodeArray[0] = new Node(wasDuWillst1);
nodeArray[1] = new Node(wasDuWillst2);
...

etc. pp.
 
hab ich das nicht ?

Code:
this.adjmatrix[i][j] = new Edge(99999999); //Adjanzenzmatrix löschen <---------------------auch hier

funktioniert aber auch nicht.

Ich seh irgendwie gerade nicht durch...
 
Also ich hab' da jetzt auch nix auffaelliges gesehen... Versuch vielleicht einfach mal die Arrays auszugeben. Dann siehst
Du ja, ob ueberall das Richtige drin steht.

Ansonsten poste einfach am besten mal die genaue Exception - die komplette Meldung.
 
Arrays ausgeben geht nicht, da die ja beim Initialisieren mit null gefüllt sind, habe ich schon probeweise versucht.

die komplette Fehlermeldung wird gerade schwierig, da ich nicht zu hause bin... kommt aber
 
Das hier koennte ein Problem geben:
Code:
Edge[][] adjmatrix = new Edge[maxNodes][maxNodes]; // neue Adjazenzmatrix anlegen
Node[] nodeArray = new Node[maxNodes]; // neuer Array für die Knoten
Du erzeugst diese Arrays "doppelt". Einmal hast Du sie im Konstruktor und dann nochmal als globale Variablen.

Versuch's mal mit:
Code:
this.adjmatrix = new Edge[maxNodes][maxNodes]; // neue Adjazenzmatrix anlegen
this.nodeArray = new Node[maxNodes]; // neuer Array für die Knoten
Ich denke mal, dass Du hier die globalen Variablen meinst, oder? Muesste dann aber vllt auch schon beim Reinschreiben
der Werte im Konstruktor Fehler geben... Nicht sicher - einfach nur 'ne Idee...
 
Moin, ich glaube, ich habe das Problem gefunden. Hab ein bisschen im Netz gesucht; man darf wohl Objekt arrays nicht im Konstruktor initialisieren, das führt dann beim Zugriff zu einer NullPointerException. Ich werd es mal mit einem init-Wrapper probieren.
 
lehmi hat gesagt.:
Moin, ich glaube, ich habe das Problem gefunden. Hab ein bisschen im Netz gesucht; man darf wohl Objekt arrays nicht im Konstruktor initialisieren, das führt dann beim Zugriff zu einer NullPointerException. Ich werd es mal mit einem init-Wrapper probieren.
nein das stimmt nicht - wo sie initialisiert werden ist schnuppe, solange die richtigen Variablen initialisiert werden.

Wie schon erwähnt wurde
Code:
Graph(int maxNodes) {
      //Hier implementieren.      
      this.maxNodes=maxNodes;
      
      Edge[][] adjmatrix = new Edge[maxNodes][maxNodes]; // neue Adjazenzmatrix anlegen
      Node[] nodeArray = new Node[maxNodes]; // neuer Array für die Knoten 

      for (int i=0; i< maxNodes; i++) {
        this.nodeArray[i]= null; // Knotenliste "löschen"  <---------------------hier
        for (int j=0; j<maxNodes; j++) {
            this.adjmatrix[i][j] = new Edge(99999999); //Adjanzenzmatrix löschen <---------------------auch hier
        } // for j
      } //for i
      
   } //Graph
ist hier das problem. du initialisierst adjmatrix und nodeArray lokal. die beiden haben nix mit den Instanzvariablen zu tun !
 
ok, sorry für meine Ignoranz... Ich habe bambis Version probiert und es funktioniert 🙂 Vielen Dank an alle !
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben