..item(i).getNodeValue() => Nullpointerexception

Mappenz

Bekanntes Mitglied
Ein bisschen Code beschreibt das Problem vielleicht am besten:

Java:
	public void traverse(Node node, int level) {
		NodeList nl = node.getChildNodes();
		
		for(int i=0; i < nl.getLength(); i++) {
                                if(nl.item(i).getNodeName().equals("Button")) {
				for(int j = 0; i < nl.item(i).getAttributes().getLength(); j++){
					System.out.println(nl.item(i).getAttributes().item(j).getNodeValue());
				}
			}			
			traverse(nl.item(i), level+1);
		}
	}

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<View>
<Backgroundimage
Backgroundimage="icons/artikelen_afbeelding_96790.jpg">
</Backgroundimage>
<Buttons>
<Button x="10" y="10" text="1"></Button>
<Button x="50" y="50" text="2"></Button>
</Buttons>
</View>[/XML]

Ausgabe
Code:
1
10
10
...
java.lang.NullPointerException
	at de.xx.xx.fischertechnikUI.views.XmlReader.traverse(XmlReader.java:70)
	at de.xx.xx.fischertechnikUI.views.XmlReader.traverse(XmlReader.java:78)
	at de.xx.xx.fischertechnikUI.views.XmlReader.traverse(XmlReader.java:78)
	at de.xx.xx.fischertechnikUI.views.XmlReader.parse(XmlReader.java:51)
	at de.xx.xx.ischertechnikUI.views.XmlReader.setConfiguration(XmlReader.java:30)
	at de.xx.xx.fischertechnikUI.views.XmlReader.selectFile(XmlReader.java:45)
	at de.xx.xx.fischertechnikUI.views.MainView.putButtons(MainView.java:27)
	at de.xx.xx.fischertechnikUI.views.MainView.createPartControl(MainView.java:22)
	at org.eclipse.ui.internal.ViewReference.createPartHelper(ViewReference.java:375)
	at org.eclipse.ui.internal.ViewReference.createPart(ViewReference.java:229)
...

Zum einen versteh ich nicht, warum die Werte im Knoten 1, 10, 10 sind, wenn ich den Knoten mit dem Hintergrundbild anschaue steht an Stelle 0 der richtige String. Zum anderen verstehe ich nicht, wie mit dieser Schleife eine Nullpointerexception geworfen werden kann.
 

Marco13

Top Contributor
for(int j = 0; i < nl.item(i).getAttributes().getLength(); j++){

Schau dir die Abbruchbedingung nochmal an.

Ansonsten ist der Code IMHO recht unübersichtlich, sowas wie
nl.item(i).getAttributes()
kann man sich als Variable speichern, das erspart einem das wiederholte "nl.item(i).getAttributes()"
 

Mappenz

Bekanntes Mitglied
Oh ja, war natürlich dumm von mir. Mit verbesserter Abbruchbedingung bleibt die Ausgabe anders als erwartet.

Code:
1
10
10

2
50
50

1
10
10

2
50
50

Ich wundere mich über die Reihenfolge 10 10 1 hätte ich erwartet. Aber auch dass es doppelt ausgegeben wird Wundert mich. Ich werde aber zunächst mal deinen Tipp beherzigen und etwas aufräumen. Vielleicht kann ich dann auch schon sehen was los ist
 

Marco13

Top Contributor
Wenn es nur um die Reihenfolge (1,10,10 statt der "erwarteten" 10,10,1) geht: Es kann gut sein, dass die Reihenfolge nicht spezifiziert ist (bzw. nicht so sein muss, wie sie in der Datei steht)...
 

Mappenz

Bekanntes Mitglied
Das wäre schon ok

Java:
int x = Integer.valueOf(firstOrderChild.getAttributes().getNamedItem("x").getNodeValue());
int y = Integer.valueOf(firstOrderChild.getAttributes().getNamedItem("y").getNodeValue());
String text = firstOrderChild.getAttributes().getNamedItem("text").getNodeValue();

mit getNamedItem() ists auch schöner. Noch habe ich aber nicht verstanden, warum beide Buttons 2 mal ausgegeben werden.
 

XHelp

Top Contributor
Vlt rufst du die einfach 2 mal auf? Ansonsten mach dir Debugausgaben drin, damit du nachvollziehen kannst warum was und wann aufgegeben wird.
 

Mappenz

Bekanntes Mitglied
Im Debugger habe ich gesehen, dass i sich komisch verhält und mir das mal ausgeben lassen. Bin überrascht dass die Länge eines Knotens die Anzahl aller Kinder und Enkel ist. Dafür muss ich mir noch was ausdenken. Was mit i los ist geht mir aber nicht rein.
Java:
	public void traverse(Node node, int level) {
		NodeList root = node.getChildNodes();
		
		for(int i=0; i < root.getLength(); i++) {
			System.out.println("root.length " + root.getLength() + " i " + i);
			Node firstOrderChild = root.item(i);
			} else if(firstOrderChild.getNodeName().equals("Button")) {;
				for(int j = 0; j < firstOrderChild.getAttributes().getLength(); j++){
					System.out.println(firstOrderChild.getAttributes().item(j).getNodeValue());
				}
				System.out.println();
			}			
			traverse(root.item(i), level+1);
		}
	}

Code:
root.length 1 i 0
root.length 5 i 0
root.length 5 i 1
root.length 1 i 0
root.length 5 i 2
root.length 5 i 3
root.length 5 i 0
root.length 5 i 1
5
10
10

root.length 5 i 2
root.length 5 i 3
2
50
50

root.length 5 i 4
root.length 5 i 4
root.length 1 i 0
root.length 5 i 0
root.length 5 i 1
root.length 1 i 0
root.length 5 i 2
root.length 5 i 3
root.length 5 i 0
root.length 5 i 1
5
10
10

root.length 5 i 2
root.length 5 i 3
2
50
50

root.length 5 i 4
root.length 5 i 4

Dabei Hänge ich ja am root oder unterhalb nichts um.
 

XHelp

Top Contributor
Die rufst du einfach nur 2 mal auf. Habs gerade getestet: bei mir kommt nur 1x die Ausgabe.
Was versuchst du überhaupt? Vlt wäre XPath besser?
 

Mappenz

Bekanntes Mitglied
Ich möchte SWT Buttons über ein Eclipse View legen. Die Coordinaten und Beschriftungen möchte ich in einer XML-Datei speichern. Mein erstes Ziel ist es eben eine solche Datei auszulesen und die Knöpfe dann auch zu erstellen. Später möchte ich bestimmt auch in die Datei schreiben. Der Benutzer wird neue Knoten erstellen oder Alte verschieben können.

Ich weis nicht ob ich mit XPath glücklicher werde. Bis eben kannte ich das gar nicht. Der Teil, der sich um das herausziehen der Coordinaten kümmert ist auch schon fast fertig. Sind ja auch kaum 10 Zeilen. Das Speichern neuer Coordinaten dürfte auch nicht aufwendiger sein. Lohnt sich ein Umstieg vielleicht trotzdem?
 

Ähnliche Java Themen

Neue Themen


Oben