# MalformedByteSequenceException und null JDOM Attribute



## Helgon (25. Dez 2011)

Hey. Ich hab folgendes Problem.

Damits verständlich und übersichtlich bleibt, mach ich alles mal in Pseudo Code


```
Klasse1{

Enter gedrückt -> schreibXML();

}
```


```
schreibXML{

schreibXML(){
 checkObDateiVorhanden()
}

schreibXML(File file){
 schreiben();
}

checkObDateiVorhanden(){
if(vorhanden)
   schreiben();
else
   erstelleXML();
}

schreiben(){

 setzt paar neue elemente

}

erstelleXML(){

  blalbla erstellt datei
  schreibXML(file); //ruft überladenen konstruktor mit der erstellten datei auf;


}

}
```

Also folgendes Problem.

Wenn ich 1x meinen Button im GUI drücke, erstellt er die xml datei (seh ich im ordner), aber ich bekomm ein


```
Exception in thread "AWT-EventQueue-0" org.jdom.IllegalDataException: The data "null" is not legal for a JDOM attribute: A null is not a legal XML value.
```

Wenn ich dann einfach noch einmal drücke, kommt kein Error und es läuft alles wie es soll.

Wenn ich dann aber ein 3tes mal drücke bekomme ich ein


```
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Ungültiges Byte 2 von 2-Byte-UTF-8-Sequenz.
```

Das hab ich gegoogelt und herausgefunden, dass es wohl daran liegt, dass die xml nicht richtig utf-8 sei.
Die XML Datei erstelle ich über einen FileWriter so das <?xml version="1.0" encoding=\"UTF-8\"?> drin steht.
Dann hab ichs mal mit weglassen des encodings probiert
und mein 3ter Versuch war die XML Datei über den wc3 dom parser zu erzeugen.
Jedes mal das Gleiche 

Hat wer ne Idee?

Grüße

EDIT mal der ganze Code, vllt hilft es


```
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;


public class DatabaseWriter {

	HashMap<String, String> artikelInfos = new HashMap<String, String>();
	
	public DatabaseWriter(HashMap<String, String> artikelInfos){

		this.artikelInfos = artikelInfos;
		File file = new File("db.xml");
		checkForExist(file);

	}
	
	public DatabaseWriter(File file){
		writeIntoDB(file);
	}
	
	private void checkForExist(File file){
		if(!file.exists()){
			createNewDB(file);
		}else{
			writeIntoDB(file);
		}
	}
	
	private void writeIntoDB(File file){
		
		try {
						
			System.out.println("0");
			
			Document doc = new SAXBuilder().build(file.toString());
			System.out.println("01");
			Element db = doc.getRootElement();
			
			System.out.println("1");
			
			//int actualSize = Integer.valueOf(db.getChild("size").getAttributeValue("value")) + 1; // holt sich aktuelle anzahl der artikel und erhöht + 1
			//db.getChild("size").setAttribute("value",String.valueOf(actualSize)); // erhöt die anzahl der artikel
			
			System.out.println("2");

			
			Element artikel = new Element("artikel").setAttribute(new Attribute("id","af")); 
			db.addContent(artikel);
			
			System.out.println("3");

	
			artikel.addContent(new Element("titel").setAttribute(new Attribute("value",artikelInfos.get("titel"))));
			artikel.addContent(new Element("autor").setAttribute(new Attribute("value",artikelInfos.get("autor"))));
			artikel.addContent(new Element("format").setAttribute(new Attribute("value",artikelInfos.get("format"))));
			artikel.addContent(new Element("preis").setAttribute(new Attribute("value",artikelInfos.get("preis"))));;
			artikel.addContent(new Element("date").setAttribute(new Attribute("value",artikelInfos.get("date"))));
			
			System.out.println("4");

			
			// ---------------------------------------------------------
			XMLOutputter xmlOutput = new XMLOutputter();
			xmlOutput.setFormat(Format.getPrettyFormat());
			xmlOutput.output(doc, new FileWriter("db.xml"));
			

			
		} catch (JDOMException | IOException e) {
			e.printStackTrace();
		}
		
	}
	
	private void createNewDB(File file){
		
		try {
			file.createNewFile();
			iniDB(file);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	private void iniDB(File file){
		
		File temp = file;
		
		try {
			BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
			bw.write("<?xml version=\"1.0\" encoding="UTF-8"?>\n");
			bw.write("<datenbank>\n<size value=\"0\" /></datenbank>");
			bw.close();
			new DatabaseWriter(temp);
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
	
}
/* HashMap zum testen
		artikelInfos.put("titel", "1");
		artikelInfos.put("autor", "2");
		artikelInfos.put("format", "3");
		artikelInfos.put("preis", "4");
		artikelInfos.put("date", "5");
*/
```

EDIT 2: Ich dreh echt am Zeiger, habs jetzt mal mit nem anderen Stream und uft-8 probiert, genau das gleiche Problem


```
private void iniDB(File file){
		
		File temp = file;
		
		try {
			Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
			out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?><datenbank><size value=\"0\" /></datenbank>");
			out.close();
			new DatabaseWriter(temp);
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
```


----------



## eRaaaa (26. Dez 2011)

Es wäre ja mal interessant wie das [c]artikelInfos[/c] aussieht welches du der Klasse übergibst.
Anscheinend liefert eines oder mehrerer deiner artikelInfos.get(...) ein 
	
	
	
	





```
null
```
 ?! Bzw. generell wäre der Inhalt mal interessant


----------



## Helgon (26. Dez 2011)

Daran liegts nicht, weil ich testweise die HashMap artikelInfos auch ausgeben lassen hab.
Hatte die gleiche Vermutung


```
private void buttonSaveActionPerformed(java.awt.event.ActionEvent evt){
		fillInfoHashMap();
		new DatabaseWriter(artikelInfos);		
	}
```


```
public void fillInfoHashMap(){
		
		Date d = new Date(); 
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
        String date = String.valueOf(sdf.format(d));
		
		artikelInfos.put("titel", titelTextArea.getText());
		artikelInfos.put("autor", autorInput.getText());
		artikelInfos.put("format", formatInput.getText());
		artikelInfos.put("preis", preisInput.getText());
		artikelInfos.put("date", date);
		
	}
```

Wie gesagt, klar könnte einer der getText() Werte null sein, sind sie aber nicht(nie!), das hab ich selbst überpüft.

Beispiel der Inhalte könnte sein:


```
titelTextArea.getText(); // Budenbrooks: Roman
autorInput.getText(); // Thomas Mann 
preisInput.getText(); // 11,95€
```

Dachte vllt, das es am € Zeichen oder so liegt, aber beim 2ten mal drücken gehts ja , also das ist nicht ausschlaggebend.

Edit: Zu erwähnen sei, dass beim 1ten mal drücken alles bis zur Ausgabe "3" läuft, also bis Zeiele 64, deswegen wär das natürlich naheliegend, aber warum sollte es dann beim 2ten mal drücken erst gehen.


----------



## eRaaaa (26. Dez 2011)

Naja, so kommen wir nicht weiter. Die Exceptions von oben zeigen doch genau auf eine Zeile oder? Auf welche? Wie lautet die gesamte Exceptionmeldung?


----------



## Helgon (26. Dez 2011)

KonsolenAusgabe, 1x drücken

```
0
01
1
2
3
Exception in thread "AWT-EventQueue-0" org.jdom.IllegalDataException: The data "null" is not legal for a JDOM attribute: A null is not a legal XML value.
	at org.jdom.Attribute.setValue(Attribute.java:491)
	at org.jdom.Attribute.<init>(Attribute.java:228)
	at org.jdom.Attribute.<init>(Attribute.java:251)
	at DatabaseWriter.writeIntoDB(DatabaseWriter.java:67)
	at DatabaseWriter.<init>(DatabaseWriter.java:32)
	at DatabaseWriter.iniDB(DatabaseWriter.java:108)
	at DatabaseWriter.createNewDB(DatabaseWriter.java:93)
	at DatabaseWriter.checkForExist(DatabaseWriter.java:37)
	at DatabaseWriter.<init>(DatabaseWriter.java:27)
	at MainFrame.buttonSaveActionPerformed(MainFrame.java:334)
	at MainFrame.access$7(MainFrame.java:332)
	at MainFrame$8.actionPerformed(MainFrame.java:194)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```
So XML Datei wurde erstellt, der header und so geschrieben, aber dann wenns dazu übergeht die ArtikelInfos zu schreiben eben der Error

Zweite mal gedrückt, alles läuft fehlerfrei durch

```
0
01
1
2
3
4
```

3tes mal drücken und folgende Male. Von der Theorie müsste der jetzt einfach mehrere indentische Artikel in die XML datei schreiben, aber es kommt auch:

```
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Ungültiges Byte 2 von 2-Byte-UTF-8-Sequenz.
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanLiteral(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:518)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:986)
	at DatabaseWriter.writeIntoDB(DatabaseWriter.java:49)
	at DatabaseWriter.checkForExist(DatabaseWriter.java:39)
	at DatabaseWriter.<init>(DatabaseWriter.java:27)
	at MainFrame.buttonSaveActionPerformed(MainFrame.java:334)
	at MainFrame.access$7(MainFrame.java:332)
	at MainFrame$8.actionPerformed(MainFrame.java:194)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```


----------



## eRaaaa (26. Dez 2011)

Mhm, zu viele Unbekannte irgendwie. Hast du mal richtig gedebuggt? Oder zumindest mal ein System.out(artikelInfos.get("preis")) gemacht VOR Zeile 64 ?


----------

