Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX应用程序中的随机ArrayIndexOutOfBoundsException_Java_Javafx - Fatal编程技术网

JavaFX应用程序中的随机ArrayIndexOutOfBoundsException

JavaFX应用程序中的随机ArrayIndexOutOfBoundsException,java,javafx,Java,Javafx,我有一个相当大的JavaFX应用程序,大部分时间都运行良好。 然而,有时我在点击应用程序时会得到随机的ArrayIndexOutofBoundsSeceptions。我无法重现错误,也不知道它们何时出现:有时我可以毫无问题地点击应用程序,有时应用程序崩溃,stacktrace出现 Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException: -1 at java.util.Arr

我有一个相当大的JavaFX应用程序,大部分时间都运行良好。 然而,有时我在点击应用程序时会得到随机的ArrayIndexOutofBoundsSeceptions。我无法重现错误,也不知道它们何时出现:有时我可以毫无问题地点击应用程序,有时应用程序崩溃,stacktrace出现

Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:418)
at java.util.ArrayList.get(ArrayList.java:431)
at javafx.scene.Parent.updateCachedBounds(Parent.java:1591)
at javafx.scene.Parent.recomputeBounds(Parent.java:1535)
at javafx.scene.Parent.impl_computeGeomBounds(Parent.java:1388)
at javafx.scene.layout.Region.impl_computeGeomBounds(Region.java:3078)
at javafx.scene.Node.updateGeomBounds(Node.java:3577)
at javafx.scene.Node.getGeomBounds(Node.java:3530)
at javafx.scene.Node.getLocalBounds(Node.java:3478)
at javafx.scene.Node.updateTxBounds(Node.java:3641)
at javafx.scene.Node.getTransformedBounds(Node.java:3424)
at javafx.scene.Node.updateBounds(Node.java:559)
at javafx.scene.Parent.updateBounds(Parent.java:1719)
at javafx.scene.Parent.updateBounds(Parent.java:1717)
at javafx.scene.Parent.updateBounds(Parent.java:1717)
at javafx.scene.Parent.updateBounds(Parent.java:1717)
at javafx.scene.Parent.updateBounds(Parent.java:1717)
at javafx.scene.Parent.updateBounds(Parent.java:1717)
at javafx.scene.Parent.updateBounds(Parent.java:1717)
at javafx.scene.Parent.updateBounds(Parent.java:1717)
at javafx.scene.Parent.updateBounds(Parent.java:1717)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2404)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
在阅读stacktrace时,唯一引起我注意的是,我的一些代码中甚至没有出现错误。 你们中有谁知道这样的问题并有想法,我可以从哪里开始调查,或者是什么导致了这个问题


我在JDK 1.8.0_74(Windows 8.1 x64)、JDK 1.8.0_77(Windows 8.1 x64)和JDK 1.8.0_91(OS X 10.11)上试用过它。

最好的方法是查找所有数组声明,然后检查其中是否有一个是动态访问的,这样可能会导致索引越界

如果可以在应用程序中引入日志记录,则可以引入调试
日志(log.debug(myArray.size()+arrayAccessVariable))

检查是否有任何阵列正在通过GUI的输入进行初始化(常见的错误源)

我想在你的情况下,它被a-1访问。一个好的做法是在每次访问之前引入否定检查


另一个好主意是使用
ArrayList
或任何其他数据类型,它们可以在需要时自行调整大小。

由于我对JavaFX非常陌生,我可能错了,但我在编写游戏时遇到了完全相同的问题。我的例子中的问题是,我试图从不同于“JavaFX应用程序线程”的线程中移动对象。由于您尚未提供代码,我不能确定,但我建议您仅通过“JavaFX应用程序线程”对GUI进行任何更改,这应该可以解决问题。

您是否从应用程序线程以外的线程更新ui。在过去的几天里,有一些类似的问题与从错误的线程更新UI有关。这里有一个等效的stacktrace,也许它可以帮助找出错误,也许一个异常断点会有所帮助,你可以跳过堆栈中的每一帧,分析变量和字段,找到问题的根源。Fabian是对的,我从UI线程以外的线程更改了UI。目前我用“Platform.runLater”修复了它,但我将重构我的体系结构。奇怪的是,我认为来自外部线程的UI更改总是会失败,而不仅仅是有时。