【问题标题】:Random ArrayIndexOutOfBoundsException in JavaFX ApplicationJavaFX 应用程序中的随机 ArrayIndexOutOfBoundsException
【发布时间】:2017-11-19 13:24:19
【问题描述】:

我有一个相当大的 JavaFX 应用程序,大部分时间都运行良好。 但是,有时我在单击应用程序时会得到随机的 ArrayIndexOutOfBoundsExceptions。我无法重现错误并且不知道它们何时出现:有时我可以毫无问题地点击应用程序,有时应用程序崩溃并出现堆栈跟踪。

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)

阅读堆栈跟踪时,唯一引起我注意的是我的某些代码中甚至没有发生错误。 有没有人知道这样的问题并有一个想法,我可以从哪里开始调查或者是什么导致了这个问题?

我在 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) 上尝试过

【问题讨论】:

  • 您是否从应用程序线程以外的线程更新 ui。过去几天出现了一些与从错误线程更新 UI 有关的类似问题。
  • 你在这里有一个等效的堆栈跟踪 stackoverflow.com/questions/19769896/… 也许它可以帮助找出问题所在
  • 也许异常断点会有所帮助,您可以遍历堆栈中的每一帧并分析变量和字段以找到问题的根源。
  • Fabian 是对的,我从 ui 线程以外的线程进行了 UI 更改。目前我用“Platform.runLater”修复了它,但我会重构我的架构。奇怪的是,我虽然从外部线程更改 UI 总是会失败,而不仅仅是有时。

标签: java javafx


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    解决此问题的最佳方法是查看所有数组声明,然后检查其中是否有任何一个被动态访问,这样可能会导致索引超出范围。

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

    检查是否有任何数组正在由来自 GUI 的输入初始化(常见的错误来源)。

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-19
      • 2013-05-28
      • 1970-01-01
      • 2012-03-25
      • 2012-02-20
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多