没有任何进一步信息的数组索引越界异常。没有行号,没有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
这只是循环和循环,直到我终止程序。
我很高兴开始尝试展示一些代码以提供一个完全可验证的示例等。但是...
现阶段我的问题是:
有什么方法可以确保我的所有异常都用相应的行号打印到输出中吗?
一些我已经尝试过的东西:
尝试捕获可疑循环和数组分配等,但无济于事。
尝试在应用程序中设置错误处理(使用此处接受的答案:General Exception handling in JavaFX 8),但是当我复制错误时,我得到的信息更少。
有关问题的更多信息:
数组是基于PDF文档创建的。计算本文档中的页数,并为数组指定页数作为其长度。然后,设置每个页面,使用它的页码 - 1(从 0 开始,例如,当有 201 页时上升到 200。
此数组随后用于在滚动窗格中显示与选项卡中的页面数量相同的面板数量。一旦它们被创建,这个功能就再也不会运行了。
最初一切正常。
上下滚动时,面板会将页面的缓冲图像添加到其标签图形中。这一切都很好,向上滚动,向下滚动,拖动拇指等
但是,当放大和缩小(基本上调整每个数组元素创建的面板的大小)时,在点击按钮几次(超过 15/20 次)之后,这会触发与调整面板大小后上下滚动时的功能相同,最终我得到这个异常。
所以,最初,一切正常,所有数组都已创建,它具有特定数量的元素,上下滚动时我可以看到它正在工作,我可以看到页数和foreach中组件的循环次数(例如for(Node n: parentNode.getChildrenUnmodifiable()){}
)与预期相同/如预期。
在这个循环中,我专门使用创建时的页码 - 1 从数组中获取元素。这永远不会超过数组的长度并且永远不会等于 -1(因为它从 1 开始,所以第一次迭代是 0)。
在使用或分配数组之前..我检查了:
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
的实现。在此 Task
的 call
方法中,您调用 Node.getBoundsLocal
,这表明您从主要用于后台执行的 class 访问 GUI。
JavaFX 与大多数 UI 工具包一样,是单线程的。您绝不能在后台线程上与实时场景图进行交互;您必须在 JavaFX 应用程序线程 上。如果您在后台线程中需要来自 UI 的信息,您可以将 Platform.runLater
与类似 CompletableFuture
的内容一起使用(参见 )。
您可以添加要更新节点的代码
进入 运行 平台后 运行 JavaFX 线程。
Platform.runLater(()->{
//put the code here
});
关于这个异常有很多答案,但说真的,我理解原因和解决方法,但找不到根本原因,所以在假设它是重复的之前请先阅读。提前致谢。
如文档所述:
https://docs.oracle.com/javase/6/docs/api/java/lang/ArrayIndexOutOfBoundsException.html
ArrayIndexOutOfBoundsException 是“抛出以指示已使用非法索引访问数组。索引为负数或大于或等于数组的大小。 “
这是不言自明的,但是,我得到了这个例外,没有任何进一步的信息。没有 class 名称,没有行号,只是例外。
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException
这只是循环和循环,直到我终止程序。
我很高兴开始尝试展示一些代码以提供一个完全可验证的示例等。但是...
现阶段我的问题是:
有什么方法可以确保我的所有异常都用相应的行号打印到输出中吗?
一些我已经尝试过的东西:
尝试捕获可疑循环和数组分配等,但无济于事。
尝试在应用程序中设置错误处理(使用此处接受的答案:General Exception handling in JavaFX 8),但是当我复制错误时,我得到的信息更少。
有关问题的更多信息:
数组是基于PDF文档创建的。计算本文档中的页数,并为数组指定页数作为其长度。然后,设置每个页面,使用它的页码 - 1(从 0 开始,例如,当有 201 页时上升到 200。
此数组随后用于在滚动窗格中显示与选项卡中的页面数量相同的面板数量。一旦它们被创建,这个功能就再也不会运行了。
最初一切正常。
上下滚动时,面板会将页面的缓冲图像添加到其标签图形中。这一切都很好,向上滚动,向下滚动,拖动拇指等
但是,当放大和缩小(基本上调整每个数组元素创建的面板的大小)时,在点击按钮几次(超过 15/20 次)之后,这会触发与调整面板大小后上下滚动时的功能相同,最终我得到这个异常。
所以,最初,一切正常,所有数组都已创建,它具有特定数量的元素,上下滚动时我可以看到它正在工作,我可以看到页数和foreach中组件的循环次数(例如
for(Node n: parentNode.getChildrenUnmodifiable()){}
)与预期相同/如预期。在这个循环中,我专门使用创建时的页码 - 1 从数组中获取元素。这永远不会超过数组的长度并且永远不会等于 -1(因为它从 1 开始,所以第一次迭代是 0)。
在使用或分配数组之前..我检查了:
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
的实现。在此 Task
的 call
方法中,您调用 Node.getBoundsLocal
,这表明您从主要用于后台执行的 class 访问 GUI。
JavaFX 与大多数 UI 工具包一样,是单线程的。您绝不能在后台线程上与实时场景图进行交互;您必须在 JavaFX 应用程序线程 上。如果您在后台线程中需要来自 UI 的信息,您可以将 Platform.runLater
与类似 CompletableFuture
的内容一起使用(参见
您可以添加要更新节点的代码 进入 运行 平台后 运行 JavaFX 线程。
Platform.runLater(()->{
//put the code here
});