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