# XML Stream Exception abfangen



## Markus_667 (13. Feb 2018)

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:

```
int state = loadFile.showOpenDialog(null);
                if (state == JFileChooser.APPROVE_OPTION) {
                    selectedFile = loadFile.getSelectedFile();
                    PNMLParser PNMLParser = new PNMLParser(selectedFile, grafikObj);
                }
```
--> Hier ist der PNML Parser:

```
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 (13. Feb 2018)

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


----------



## Markus_667 (13. Feb 2018)

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();


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


----------



## olfibits (13. Feb 2018)

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


----------



## Markus_667 (13. Feb 2018)

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 (13. Feb 2018)

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

Wo und wie wird parse aufgerufen?


----------



## Markus_667 (13. Feb 2018)

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 (13. Feb 2018)

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)


----------



## Markus_667 (15. Feb 2018)

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


----------



## mrBrown (15. Feb 2018)

Wie hast du‘s denn gelöst?


----------



## mrBrown (15. Feb 2018)

BTW: 





olfibits hat gesagt.:


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


----------

