# Stackoverflowerror beheben



## frani100 (7. Jan 2010)

Hallo,

Ich habe ein Java –Programm, das ganz viele XML-Dateien gegen ein Schema validiert. Es funktioniert auch alles, aber immer wieder wird ein StackOverflowError ausgelöst. 

Hier ein kurzer Ausschnitt aus meinem Programm:

```
public static void schemaPruefen() throws Exception {

Thread myThread = new Thread() {
String zeile = "";
public void run() { 
try {
BufferedReader in = new BufferedReader(new FileReader(new File(pfadliste)));
			int anzwhile =0;
			while ((zeile = in.readLine()) != null) {
				anzwhile++;
				try {						
					Validierung(zeile);
				} catch (Exception e) {
					e.printStackTrace();
				}				
			}
		} catch (IOException e) {
			e.printStackTrace();				
		}catch (Exception e) {
			e.printStackTrace();
		}
};
myThread.start();
}

public static void Validierung(String xml) throws Exception {
	SchemaErrorHandler seh=new SchemaErrorHandler(new String(xml));
	DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
	factory.setValidating(true);
	factory.setNamespaceAware(true);
	try {
		DocumentBuilder builder = factory.newDocumentBuilder();
		builder.setErrorHandler(seh); 

		Document doc = builder.parse(new File(xml));
			
		Validator validator = schema.newValidator();	
		validator.validate(new DOMSource(doc));
			
		System.out.println(xml + " ist valide.\r\n");
		anzalle++;
		anzok++;
	} catch(StackOverflowError e) {
		System.out.println(“Stackoverflowerror:“ + xml);
	}
}
```

In der Methode Validierung, im try-catch Block wir der Stackoverflowerror ausgelöst. Immer an einer anderen XML-Datei. Ich schätze auch, weil diese unterschiedlich groß sind.

Der Aufruf java -Xms6m programm kommt bei mir nicht in Frage, weil ich das Programm eine GUI hat und über ein jar-Packet gestartet wird.

Hat da einer ne Idee und kann mir helfen?


----------



## maki (7. Jan 2010)

> Der Aufruf java -Xms6m programm kommt bei mir nicht in Frage, weil ich das Programm eine GUI hat und über ein jar-Packet gestartet wird.


Ohne jetzt auf ein mögliches Problem im Quelltext einzugehen:
Es ist absolut üblich eine Java Anwendung, welche als Jar vorliegt, über shell scripte (.bat, .cmd, bash etc) zu starten, denn nur so kann man Speicherwerte (Stack, Heap, etc) tunen.


----------



## Empire Phoenix (7. Jan 2010)

Anenommen es liegt nicht an design schwächen, kannst du es per batch datei die parameter übergeben oder es mithilfe eines wrappers in eine ausfürbare datei packen, die sich dann darum kümmert, musste wenn mal bei google gucken gibt es dutzende projecte für.


----------



## SAXe (7. Jan 2010)

frani100 hat gesagt.:


> Hat da einer ne Idee und kann mir helfen?



SAX parser verwenden.


----------



## Landei (7. Jan 2010)

SAXe hat gesagt.:


> SAX parser verwenden.



Würde ich auch vorschlagen. Ein Stackoverflow kommt von zu großer Rekursionstiefe, und da wird mehr Speicher nur bedingt helfen. Bei einem "platten" Parser wie SAX sollte das eigentlich kein Problem sein.


----------



## frani100 (8. Jan 2010)

Danke für die Vorschläge...ich werde das mal mit dem SAX parser versuchen!


----------

