2016-07-17 6 views
0

私は約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()を呼び出すときにのみ発生するのですか?

+0

工場はどこに作成されていますか?コードにはいくつかのコンテキストが必要です。変更が発生するたびに新しいファクトリが作成されたかのように表示されます。変更リスナ内で引用されるか、または1つずつ呼び出される行ですか? – Itai

+0

ファクトリはupdatePanes()というメソッドで作成されます。これは、最初にビューを初期化するとき、およびビュー内のボタンがクリックされるたびに呼び出されます。 updatePanes()メソッドがinitialize()によって最初に呼び出されたときにエラーが発生します。 – Duval

+0

SpinnerValueFactory factory = new ...にブレークポイントを追加して、スタックトレースを表示することができます(ide、eclipse、netbeans ...) – guleryuz

答えて

1

私は自分のIDEのデバッガを使用しました(実際にはじめて)、「Java例外ブレークポイント」を設定するオプションが見つかりました。それは私の例外にいくつかの情報を追加しました:http://i.stack.imgur.com/jGc7J.png

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

はもちろん、私は0に、工場の最小値を設定し、動作しない-2に最大値を設定しようとしました。私はデータベースの値を変更し、今は正常に動作します。どのような恥ずかしい欠陥。ご協力いただきありがとうございます!

関連する問題