2016-07-17 3 views
0

Ich habe eine foreach-Schleife erstellen etwa 180 Scheiben und initialisieren sie. Ein Teil der Scheiben ist ein Spinner. Für jeden Spinner eine neue SpinnerValueFactory wird:JavaFX: Neue SpinnerValueFactory Ergebnisse in StackOverflow

SpinnerValueFactory factory = new SpinnerValueFactory.IntegerSpinnerValueFactory(0, products.get(i).getStock()); 
//getStock() returns an integer between 0 and 300 

Jede 6. Mal wird die foreach-Schleife durchlaufen, bekomme ich folgende Fehlermeldung:

Exception in Application start method 
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.StackOverflowError (the following lines repeat) 
    at javafx.scene.control.SpinnerValueFactory$IntegerSpinnerValueFactory.lambda$new$215(SpinnerValueFactory.java:475) 
    at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182) 
    at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81) 
    at javafx.beans.property.ObjectPropertyBase.fireValueChangedEvent(ObjectPropertyBase.java:105) 
    at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112) 
    at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:146) 
    at javafx.scene.control.SpinnerValueFactory.setValue(SpinnerValueFactory.java:150) 
at javafx.scene.control.SpinnerValueFactory$IntegerSpinnerValueFactory.lambda$new$215(SpinnerValueFactory.java:478)(...) 

Es ist wie Java sieht stoppt neue SpinnerValueFactories aufgrund einer Schaffung Paketüberfluss. Dann versucht Java, die Factory auf die Spinner zu setzen, aber da keine Factory existiert, werden mehr Fehler gedruckt. Wenn ich den Methodenaufruf zu entfernen, tritt kein Fehler auf:

SpinnerValueFactory factory = new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 5); 

Das Projekt in einer Datenbank verschachtelt ist, eine FXML Datei, deren Steuerung und eine Abschuss Klasse. Ich habe versucht, ein minimales Beispiel zu geben, aber das Entfernen von allem außer der verkürzten Methode führte zu keinem Fehler. Interessanterweise erlebt ein Freund von mir, der dasselbe Projekt und dasselbe SDK verwendet, keinen Fehler. Für mich ist es auch merkwürdig, dass es genau 6 Mal dauert, bis die StackOverflow-Schleife durch die foreach-Schleife geht, während die zweite Version alle 180 Fenster ohne Probleme erstellt. Warum tritt der StackOverflow nur bei Aufruf von getStock() auf?

+0

Wo wird die Fabrik erstellt? Für den Code wird ein bestimmter Kontext benötigt. Es scheint so, als ob bei jeder Änderung eine neue Factory entsteht - wird die Zeile in einem Change-Listener zitiert oder von einem aufgerufen? – Itai

+0

Die Factory wird in einer Methode namens updatePanes() erstellt. Es wird aufgerufen, wenn die Ansicht zum ersten Mal initialisiert wird und wenn auf eine Schaltfläche in der Ansicht geklickt wird. Ich erhalte den Fehler, wenn die Methode updatePanes() zum ersten Mal von initialize() aufgerufen wird. – Duval

+0

können Sie einen Breakpoint in der Zeile SpinnerValueFactory factory = new ... hinzufügen und uns den Stack-Trace anzeigen lassen (in Ihrer IDE, Eclipse, Netbeans ...) – guleryuz

Antwort

1

Ich benutzte den Debugger meiner IDE (eigentlich das erste Mal) und fand die Option 'Java Exception Breakpoints' zu setzen. Er fügte hinzu, einige Informationen zu meiner Ausnahme: http://i.stack.imgur.com/jGc7J.png

Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate java.lang.Integer.toString() 
value=-2 

Offensichtlich habe ich den Minimalwert der Fabrik auf 0 gesetzt und versucht, den maximalen Wert auf -2 einzustellen, die nicht funktioniert. Ich habe den Wert in der Datenbank geändert und jetzt funktioniert es gut. Was für ein peinlicher Fehler. Danke für Ihre Hilfe!