代码之家  ›  专栏  ›  技术社区  ›  Adam

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

  •  -1
  • Adam  · 技术社区  · 5 年前

    正如文件所说:

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

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

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

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

    ArrayIndexOutOfBoundsException

    现阶段我的问题是:

    有些事情我已经尝试过了:

    有关此问题的进一步信息:

    • 数组是基于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)) {}

    • 这确保了数组具有元素,并且长度与文档中的页数相同,因为数组大小应始终与文档中的页数相同,而且很明显,在我多次垃圾邮件发送放大或缩小按钮之前,它一直有效。

    • 这是目前应用程序中使用的唯一阵列,其他阵列已经创建、使用过,目前还没有运行functionallity,但我正在努力了解这是如何导致错误的。

    • 我的一小部分感觉就像,当调用放大等或滚动等时,在加速线程上,太多的线程正在把锅弄得一团糟,但这只是我抓住一点稻草的一个假设。

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

    编辑:

    我遇到的问题是:

    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$2.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$3.call(Utility.java:252)
        at tdiesfxml.Utility$3.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 尽管如此,我还是有点困惑,为什么这会抛出我得到的异常。

    1 回复  |  直到 5 年前
        1
  •  2
  •   Slaw    5 年前

    基于堆栈跟踪,问题在于您正在从后台线程访问和/或修改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$2.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$3.call(Utility.java:252)               // HERE
        at tdiesfxml.Utility$3.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 . 内部 call 这种方法 Task 你打电话 Node.getBoundsLocal

    JavaFX和大多数UI工具包一样,是单线程的。决不能与背景线程上的实时场景图形交互;你一定在路上 JavaFX应用程序线程 Platform.runLater CompletableFuture (见 this question ).

        2
  •  0
  •   N E W T I N G Z    3 年前

    您可以添加要更新节点的代码 进入平台runlater,该平台将在 JavaFX线程 .

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