没有任何进一步信息的数组索引越界异常。没有行号,没有class,只是例外

Array Index Out Of Bounds Exception without any further information. No line number, no class, just the exception

关于这个异常有很多答案,但说真的,我理解原因和解决方法,但找不到根本原因,所以在假设它是重复的之前请先阅读。提前致谢。

如文档所述:

https://docs.oracle.com/javase/6/docs/api/java/lang/ArrayIndexOutOfBoundsException.html

ArrayIndexOutOfBoundsException 是“抛出以指示已使用非法索引访问数组。索引为负数或大于或等于数组的大小。

这是不言自明的,但是,我得到了这个例外,没有任何进一步的信息。没有 class 名称,没有行号,只是例外。

Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException

这只是循环和循环,直到我终止程序。

我很高兴开始尝试展示一些代码以提供一个完全可验证的示例等。但是...

现阶段我的问题是:

有什么方法可以确保我的所有异常都用相应的行号打印到输出中吗?

一些我已经尝试过的东西:

有关问题的更多信息:

if ((array.length > 0) && (array.length == numberOfPagesInDocument) && (counter < numberOfPagesInDocument)) {}

任何帮助将不胜感激,并提前感谢您,如果每个人都不知所措,我将努力提供更多信息和代码示例。

编辑:

我遇到的问题是:

Bounds childBounds = child.localToScene(child.getBoundsInLocal());

The task failed with the following exception:
java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(ArrayList.java:422)
    at java.util.ArrayList.get(ArrayList.java:435)
    at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:89)
    at com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:306)
    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$MiscProperties.computeBounds(Node.java:6472)
    at javafx.scene.Node$LazyBoundsProperty.get(Node.java:9306)
    at javafx.scene.Node$LazyBoundsProperty.get(Node.java:9276)
    at javafx.scene.Node.getBoundsInLocal(Node.java:3156)
    at tdiesfxml.Utility.call(Utility.java:252)
    at tdiesfxml.Utility.call(Utility.java:235)
    at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:748)

虽然这些是 Bounds,但我有点困惑为什么这会抛出我得到的异常。

我现在正在研究这个问题,不确定如何处理这个问题,因为它已经有所发展,但我会在这里添加我的发现,如果有人知道为什么 Bounds 会抛出这个异常,我将不胜感激.

根据该堆栈跟踪,问题是您正在访问 and/or 从后台线程修改 GUI。

java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(ArrayList.java:422)
    at java.util.ArrayList.get(ArrayList.java:435)
    at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:89)
    at com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:306)
    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$MiscProperties.computeBounds(Node.java:6472)
    at javafx.scene.Node$LazyBoundsProperty.get(Node.java:9306)
    at javafx.scene.Node$LazyBoundsProperty.get(Node.java:9276)
    at javafx.scene.Node.getBoundsInLocal(Node.java:3156)
    at tdiesfxml.Utility.call(Utility.java:252)               // HERE
    at tdiesfxml.Utility.call(Utility.java:235)               // HERE
    at javafx.concurrent.Task$TaskCallable.call(Task.java:1423) // HERE
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) // HERE
    at java.lang.Thread.run(Thread.java:748)                   

标有// HERE的行表示代码是javafx.concurrent.Task的实现。在此 Taskcall 方法中,您调用 Node.getBoundsLocal,这表明您从主要用于后台执行的 class 访问 GUI。

JavaFX 与大多数 UI 工具包一样,是单线程的。您绝不能在后台线程上与实时场景图进行交互;您必须在 JavaFX 应用程序线程 上。如果您在后台线程中需要来自 UI 的信息,您可以将 Platform.runLater 与类似 CompletableFuture 的内容一起使用(参见 )。

您可以添加要更新节点的代码 进入 运行 平台后 运行 JavaFX 线程

 Platform.runLater(()->{
                  //put the code here
               
                    });