XML Stream Exception abfangen

Diskutiere XML Stream Exception abfangen im XML und Co. Bereich.
M

Markus_667

Hallo Zusammen,

ich habe folgendes Problem. Ich möchte eine XML Datei (in meinem Fall ein PNML Format) einlesen. Wenn die Datei allerdings fehlerhaft ist, möchte ich, dass das Programm weiter läuft und eine Meldung kommt, dass die Datei fehlerhaft ist.

Folgendes habe ich programmiert:
--> Hier wird der Parster gestartet:
Java:
int state = loadFile.showOpenDialog(null);
                if (state == JFileChooser.APPROVE_OPTION) {
                    selectedFile = loadFile.getSelectedFile();
                    PNMLParser PNMLParser = new PNMLParser(selectedFile, grafikObj);
                }
--> Hier ist der PNML Parser:
Java:
public final void parse() {
        while (xmlParser.hasNext()) {
            try {
                XMLEvent event = xmlParser.nextEvent();
                switch (event.getEventType()) {
                case XMLStreamConstants.START_ELEMENT:
                    handleStartEvent(event);
              .
              .
              .
             } catch (XMLStreamException e) {
                System.err.println("Fehler beim Parsen des PNML Dokuments. " + e.getMessage());
                e.printStackTrace();
                    break;
Nun stürzt das Programm aber doch ab und kann nicht mehr weiter bearbeitet werden.
Ich meine aber doch, dass ich mit dem try catch Block das abgefangen habe ?
Anscheinend bin ich aber auf dem Holzweg ??
Muss ich beim Aufruf des Parsers auch noch einmal einen try catch Block machen ?

Ich schaue da nicht richtig durch, vielleicht kann mir dabei noch jemand helfen.

Danke
 
olfibits

olfibits

Bitte die geworfene Fehlermeldung posten, damit klar ist, was abgefangen werden muss.
 
M

Markus_667

Worauf muss ich beim Lesen der Fehlermeldung achten ?
Bis jetzt sehe ich nur welche Exception auftritt und an welcher Zeile.
(Also die Aufrufreihenfolge bis Zeile 125)
Zeile 125:
XMLEvent event = xmlParser.nextEvent();

Java:
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content ist nicht zulässig in Prolog.
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
    at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
    at XX.PNMLParser.parse(PNMLParser.java:125)
    at XX.PNMLParser.<init>(PNMLParser.java:93)
    at XX.Optionen$5.actionPerformed(Optionen.java:196)
    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.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(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$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.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$JavaSecurityAccessImpl.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)
Fehler beim Parsen des PNML Dokuments. ParseError at [row,col]:[1,1]
Message: Content ist nicht zulässig in Prolog.
Die Fehlermeldung läuft dann in einer Dauerschleife bis ich abbreche.
 
Zuletzt bearbeitet:
olfibits

olfibits

while (xmlParser.hasNext()) {
Daher die Dauerschleife. Aber:
catch(XMLStreamException e) {
hier wird eigentlich die bemängelte Exception geworfen. Versuche mal explizit javax.xml.stream.XMLStreamException.
Sollte das nichts bringen versuche mal ein nicht besonders schönes, allgemeines "Exception e" im catch.
Zum Schluss allerdings scheint die Exception geworfen worden zu sein, wie es aussieht. ("Fehler beim Parsen...")
Normalerweise sollte die vorige Meldung eigentlich nicht auftauchen sondern einfach nur der Exception-Block ausgeführt werden.

Andere Frage: soll die Datei jetzt bei deinem Test valide sein oder nicht? Wenn ja haben wir ein weiteres Problem.
 
M

Markus_667

Nein es soll keine valide Datei sein, die Datei ist eine absichtliche erzeugte mit Fehlern behaftete Datei.
Danke schon mal.
Probiere ich heute Abend mal aus.
 
mrBrown

mrBrown

Fang die Exception außerhalb der Schleife und nicht innerhalb.

Wo und wie wird parse aufgerufen?
 
M

Markus_667

parse wird im Konstruktor aufgerufen mit this.parse().

Stimmt eigentlich, warum mache ich das in der Schleife... völlig unnötig.
Super Idee, danke :)
 
mrBrown

mrBrown

Dann wirf die Exception besser weiter und fang sie außerhalb des Konstruktors ;)

(Ich würde in dem Fall auch Konstruktor und das starten des Parsens trennen, meistens ist das problematisch)
 
M

Markus_667

So ich habe das Problem gelöst. Danke an mrBrown und olfibits. Hat beides zur Lösung beigetragen.
Dickes Merci
 
mrBrown

mrBrown

BTW:
Versuche mal explizit javax.xml.stream.XMLStreamException.
Sollte das nichts bringen versuche mal ein nicht besonders schönes, allgemeines "Exception e" im catch.
Zum Schluss allerdings scheint die Exception geworfen worden zu sein, wie es aussieht. ("Fehler beim Parsen...")
Normalerweise sollte die vorige Meldung eigentlich nicht auftauchen sondern einfach nur der Exception-Block ausgeführt werden.
Es wird bereits die richtige Exception gefangen und auch korrekt der catch-Block ausgeführt.

Das was du wahrscheinlich mit „vorige Meldung“ meinst, ist einfach nur die Ausgabe, die im catch-Block gemacht wird.
 
Thema: 

XML Stream Exception abfangen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben