JavaFX:StackOverflow 中的新 SpinnerValueFactory 结果

JavaFX: New SpinnerValueFactory results in StackOverflow

我有一个 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$launchApplication5(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.WhosebugError (the following lines repeat)
    at javafx.scene.control.SpinnerValueFactory$IntegerSpinnerValueFactory.lambda$new5(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$new5(SpinnerValueFactory.java:478)(...)

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

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

该项目嵌套在一个数据库、一个 FXML 文件、它的控制器和一个启动器中 class。我试着做一个最小的例子,但是删除除了缩短的方法之外的所有东西都没有导致错误。有趣的是,我的一个朋友使用相同的项目和相同的 SDK 没有遇到任何错误。对我来说,在 Whosebug 发生之前,foreach 循环恰好需要 6 次,而第二个版本毫无问题地创建了所有 180 个窗格,这似乎也很奇怪。为什么 Whosebug 仅在调用 getStock() 时发生?

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

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

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