我有一个 foreach 循环创建大约 180 个 Pane 并初始化它们。 Pane 的一部分是一个旋转器。对于每个微调器都会创建一个新的 SpinnerValueFactory:
SpinnerValueFactory factory = new SpinnerValueFactory.IntegerSpinnerValueFactory(0, products.get(i).getStock());
//getStock() returns an integer between 0 and 300
每 6 次执行 foreach 循环,我都会收到以下错误:
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 文件、 Controller 和启动类中。我尝试制作一个最小的示例,但是删除除缩短方法之外的所有内容都不会导致错误。有趣的是,我的一个 friend 使用相同的项目和相同的 SDK 没有遇到任何错误。对我来说,这似乎也很奇怪,因为在发生 StackOverflow 之前,需要执行 6 次 foreach 循环,而第二个版本则创建所有 180 个 Pane ,没有任何问题。为什么只有调用 getStock() 时才会出现 StackOverflow?
最佳答案
我使用 IDE 的调试器(实际上是第一次),找到了设置“Java 异常断点”的选项。它向我的异常(exception)添加了一些信息: /image/jGc7J.png
Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate java.lang.Integer.toString()
value=-2
显然,我将工厂的最小值设置为 0,并尝试将最大值设置为 -2,但这是行不通的。我更改了数据库中的值,现在工作正常。这是多么令人尴尬的错误啊。感谢您的帮助!
关于JavaFX : New SpinnerValueFactory results in StackOverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38420147/