MalformedByteSequenceException und null JDOM Attribute

Helgon

Bekanntes Mitglied
Hey. Ich hab folgendes Problem.

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

Java:
Klasse1{

Enter gedrückt -> schreibXML();

}

Java:
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

Java:
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

Java:
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

Java:
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

Java:
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();
		}	
	}
 
Zuletzt bearbeitet:
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
Code:
null
?! Bzw. generell wäre der Inhalt mal interessant
 
Daran liegts nicht, weil ich testweise die HashMap artikelInfos auch ausgeben lassen hab.
Hatte die gleiche Vermutung

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

Java:
	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:

Java:
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.
 
Zuletzt bearbeitet:
Naja, so kommen wir nicht weiter. Die Exceptions von oben zeigen doch genau auf eine Zeile oder? Auf welche? Wie lautet die gesamte Exceptionmeldung?
 
KonsolenAusgabe, 1x drücken
Java:
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
Java:
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:
Java:
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)
 
Mhm, zu viele Unbekannte irgendwie. Hast du mal richtig gedebuggt? Oder zumindest mal ein System.out(artikelInfos.get("preis")) gemacht VOR Zeile 64 ?
 

Neue Themen


Zurück
Oben