XML Stream Exception abfangen

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
 
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:
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.
 
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.
 
parse wird im Konstruktor aufgerufen mit this.parse().

Stimmt eigentlich, warum mache ich das in der Schleife... völlig unnötig.
Super Idee, danke :)
 
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)
 
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.
 
Passende Stellenanzeigen aus deiner Region:

Oben