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



## Mappenz (13. Aug 2011)

Ein bisschen Code beschreibt das Problem vielleicht am besten:


```
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

```
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 (13. Aug 2011)

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 (13. Aug 2011)

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


```
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 (13. Aug 2011)

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)...


----------



## Final_Striker (14. Aug 2011)

Mappenz hat gesagt.:


> Ich wundere mich über die Reihenfolge 10 10 1 hätte ich erwartet.



Es sieht so aus, dass die Attribute einer Node alphabetisch sortiert werden.


----------



## Mappenz (14. Aug 2011)

Das wäre schon ok


```
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 (14. Aug 2011)

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


----------



## Mappenz (14. Aug 2011)

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. 

```
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);
		}
	}
```


```
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 (14. Aug 2011)

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 (14. Aug 2011)

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?


----------

