JavaFX:新的SpinnerValueFactory导致StackOverflow

时间:2016-07-17 10:15:14

标签: java javafx-8 spinner

我有一个foreach循环创建大约180个窗格并使它们初始化。窗格的一部分是旋转器。对于每个微调器,都会创建一个新的SpinnerValueFactory:

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

foreach循环每经过第6次,我都会收到以下错误:

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)(...)

由于StackOverflow,Java似乎停止创建新的SpinnerValueFactories。然后Java尝试将工厂设置为微调器,但由于不存在工厂,因此会打印更多错误。 如果我删除方法调用,则不会发生错误:

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

项目嵌套在数据库,FXML文件,控制器和启动类中。我试图做一个最小的例子,但删除除了缩短的方法之外的所有内容都没有导致错误。有趣的是,我的一个朋友使用相同的项目和相同的SDK没有遇到任何错误。对我来说,看起来很奇怪,直到StackOverflow发生需要6次才能完成foreach循环,而第二个版本创建所有180个窗格没有任何问题。为什么只有在调用getStock()时才会出现StackOverflow?

1 个答案:

答案 0 :(得分:1)

我使用了IDE的Debugger(实际上是第一次),并找到了设置Java Exception Breakpoints'的选项。它为我的例外添加了一些信息: http://i.stack.imgur.com/jGc7J.png

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

显然,我将工厂的最小值设置为0,并尝试将最大值设置为-2,但不起作用。我更改了数据库中的值,现在它工作正常。多么尴尬的错误。谢谢你的帮助!