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

Javafx 数组索引越界异常,无任何进一步信息。没有行号,没有类别,只有例外,javafx,exception-handling,indexoutofboundsexception,Javafx,Exception Handling,Indexoutofboundsexception,关于这个异常有很多答案,但我真的理解原因和如何修复,但找不到根本原因,所以请在假设它是重复之前阅读。提前谢谢 正如文件所说: “抛出ArrayIndexOutOfBoundsException以指示已使用非法索引访问数组。该索引为负值或大于或等于数组的大小。” 这是不言自明的,但是,我得到了这个例外,没有任何进一步的信息。没有类名,没有行号,只有例外 线程“JavaFX应用程序线程”java.lang.ArrayIndexOutOfBoundsException中的异常 这只是一个又一个循环

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

正如文件所说:

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

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

线程“JavaFX应用程序线程”java.lang.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

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

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

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

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

编辑: 我遇到的问题是:

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

这些是
边界
,所以有点困惑,为什么会抛出我得到的异常


我现在正在研究这个问题,不知道如何处理这个问题,因为它有点演变,但我将在这里添加我的发现,如果有人知道为什么Bounds会抛出这个异常,我将非常感激。

基于堆栈跟踪,问题是您正在从后台线程访问和/或修改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)                   
这里用
//标记的行
表示该代码是
javafx.concurrent.Task
的实现。在该
Task
调用
方法中,您调用了
节点.getBoundsLocal
,它显示您从一个主要用于后台执行的类访问GUI


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

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

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

这是商业性的。所以有点灰色。如果没有人能帮我解决有关异常处理的实际问题,当然可以。只是意味着我需要考虑我共享的内容=]仅使用基本
数组。get(counter)
,但是元素已经是
 Platform.runLater(()->{
                  //put the code here
               
                    });