私は約180のペインを作成し、それらを初期化するforeachループを持っています。ペインの一部はスピナーです。ごとに新しいSpinnerValueFactoryが行われたスピナー:JavaFX:新しいSpinnerValueFactoryの結果はStackOverflowになります
SpinnerValueFactory factory = new SpinnerValueFactory.IntegerSpinnerValueFactory(0, products.get(i).getStock());
//getStock() returns an integer between 0 and 300
foreachループを経ているすべての6回目は、私は次のエラーを取得:Javaはのために新しいSpinnerValueFactoriesの作成を停止するよう
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)(...)
をに見えますスタックオーバーフロー。その後、Javaは工場をスピナーに設定しようとしますが、工場が存在しないため、より多くのエラーが出力されます。私は、メソッドの呼び出しを削除した場合 は、エラーは発生しません:
SpinnerValueFactory factory = new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 5);
プロジェクトはデータベース、FXMLファイル、そのコントローラおよび起動クラスでネストされています。私は最小限の例を作ろうとしましたが、短縮された方法以外のすべてを削除するとエラーは発生しませんでした。興味深いことに、同じプロジェクトを使用している私の友人で、同じSDKにエラーはありません。私にとっては、StackOverflowが発生するまでforeachループを実行するのにちょうど6回かかるのは奇妙に思えますが、2番目のバージョンでは問題なく180個のペインがすべて作成されます。なぜStackOverflowはgetStock()を呼び出すときにのみ発生するのですか?
工場はどこに作成されていますか?コードにはいくつかのコンテキストが必要です。変更が発生するたびに新しいファクトリが作成されたかのように表示されます。変更リスナ内で引用されるか、または1つずつ呼び出される行ですか? – Itai
ファクトリはupdatePanes()というメソッドで作成されます。これは、最初にビューを初期化するとき、およびビュー内のボタンがクリックされるたびに呼び出されます。 updatePanes()メソッドがinitialize()によって最初に呼び出されたときにエラーが発生します。 – Duval
SpinnerValueFactory factory = new ...にブレークポイントを追加して、スタックトレースを表示することができます(ide、eclipse、netbeans ...) – guleryuz