当前位置: 首页 > 知识库问答 >
问题:

FilteredList在更新时提供java.lang.ArrayIndexOutOfBoundsException

施阳夏
2023-03-14

我创建了一个简单的应用程序来测试过滤列表及其在相应的源列表更改时的行为。我也想测试更新更改,所以我创建了ObservableListObservableList。它比创建额外的类(如Person)更快更简单,这些类具有可观察的字段。

    ListChangeListener<ObservableList<String>> changeNotifier = new ListChangeListener<ObservableList<String>>() {
        @Override
        public void onChanged(Change<? extends ObservableList<String>> c) {
            while (c.next()) {
                if (c.wasPermutated()) {
                    System.out.println("permutation");
                } else if (c.wasUpdated()) {
                    System.out.println("update");
                } else {
                    if (c.wasRemoved()) {
                        System.out.println("remove");
                    }
                    if (c.wasAdded()) {
                        System.out.println("add");
                    }
                    if (c.wasReplaced()) {
                        System.out.println("replace");
                    }
                }
            }
        }
    };
    Callback<ObservableList<String>, Observable[]> identityExtractor = new Callback<ObservableList<String>, Observable[]>() {
        @Override
        public Observable[] call(ObservableList<String> param) {
            return new Observable[]{param};
        }
    };
    Predicate<ObservableList<String>> nonEmptyFilter = new Predicate<ObservableList<String>>() {
        @Override
        public boolean test(ObservableList<String> obsl) {
            boolean nonEmpty = ! obsl.isEmpty();
            for (String item : obsl) {
                nonEmpty = nonEmpty && (null != item) && ("" != item);
            };
            return nonEmpty;
        }
    };

    ObservableList<ObservableList<String>> basicSimple = FXCollections.observableArrayList();
    ObservableList<ObservableList<String>> basicComposed = FXCollections.observableArrayList( identityExtractor );

    ObservableList<ObservableList<String>> filteredSimple = basicSimple.filtered( nonEmptyFilter );
    ObservableList<ObservableList<String>> filteredComposed = basicComposed.filtered( nonEmptyFilter );

    System.out.println("Basic testing");

    System.out.println("Add invalid");
    basicSimple.addAll( FXCollections.observableArrayList("") );
    System.out.println( basicSimple );
    System.out.println( filteredSimple );

    System.out.println("Make it valid");
    basicSimple.get(0).addAll("first");
    System.out.println( filteredSimple );

    System.out.println("Add valid");
    basicSimple.addAll( FXCollections.observableArrayList("Second") );
    System.out.println( filteredSimple );

    System.out.println("Composed testing");

    System.out.println("Add invalid");
    basicComposed.addAll( FXCollections.observableArrayList("") );
    System.out.println( basicComposed );
    System.out.println( filteredComposed );

    System.out.println("Make it valid");
    basicComposed.get(0).addAll("first");
    System.out.println( filteredComposed );

    System.out.println("Add valid");
    basicComposed.addAll( FXCollections.observableArrayList("Second") );
    System.out.println( filteredComposed );

我在测试中发现了一个奇怪的错误:

[info] Running helloworld.HelloWorld 
Basic testing
Add invalid
[[]]
[]
Make it valid
[]
Add valid
[[Second]]
Composed testing
Add invalid
[[]]
[]
Make it valid
[error] (JavaFX Application Thread) java.lang.ArrayIndexOutOfBoundsException
java.lang.ArrayIndexOutOfBoundsException
        at java.lang.System.arraycopy(Native Method)
        at javafx.collections.transformation.FilteredList.updateFilter(FilteredList.java:298)
        at javafx.collections.transformation.FilteredList.update(FilteredList.java:239)
        at javafx.collections.transformation.FilteredList.sourceChanged(FilteredList.java:137)
        at javafx.collections.transformation.TransformationList.lambda$getListener$16(TransformationList.java:106)
        at javafx.collections.transformation.TransformationList$$Lambda$63/1596532574.onChanged(Unknown Source)
        at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88)
        at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164)
        at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
        at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
        at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:485)
        at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
        at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
        at com.sun.javafx.collections.ObservableListWrapper.access$200(ObservableListWrapper.java:45)
        at com.sun.javafx.collections.ObservableListWrapper$1$1.invalidated(ObservableListWrapper.java:75)
        at com.sun.javafx.collections.ListListenerHelper$SingleInvalidation.fireValueChangedEvent(ListListenerHelper.java:126)
        at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
        at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
        at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
        at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
        at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
        at javafx.collections.ModifiableObservableListBase.addAll(ModifiableObservableListBase.java:102)
        at javafx.collections.ObservableListBase.addAll(ObservableListBase.java:245)
        at helloworld.HelloWorld.start(HelloWorld.java:87)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153(LauncherImpl.java:821)
        at com.sun.javafx.application.LauncherImpl$$Lambda$55/7143454.run(Unknown Source)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(PlatformImpl.java:323)
        at com.sun.javafx.application.PlatformImpl$$Lambda$51/397137382.run(Unknown Source)
        at com.sun.javafx.application.PlatformImpl.lambda$null$164(PlatformImpl.java:292)
        at com.sun.javafx.application.PlatformImpl$$Lambda$53/1802784360.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(PlatformImpl.java:291)
        at com.sun.javafx.application.PlatformImpl$$Lambda$52/1184782272.run(Unknown Source)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
        at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
        at com.sun.glass.ui.gtk.GtkApplication.lambda$null$45(GtkApplication.java:126)
        at com.sun.glass.ui.gtk.GtkApplication$$Lambda$43/450111611.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:745)
[trace] Stack trace suppressed: run last compile:run for the full output.
[]
Add valid
[[Second]]

basicsimplebasiccomposite之间的区别在于后者定义了一个提取器,因此它接收更新事件。在处理update事件的过程中,本机代码引发了异常。为了使示例代码不出错,我应该考虑什么?

我已经将println插入到nonemptyfilter谓词测试的末尾。它工作正常,传递给它的ObservableList与刚更新的新值一样。稍后执行FilteredList的某些迭代代码时,会出现此错误。

共有1个答案

夏侯玄天
2023-03-14

这看起来像一个虫子;我想它可能和这个一样,错误报告说它是为JavaFX8U60修复的(可能对8U40来说太晚了)。

我在1.8.0_40-EA-B23上测试了??和1.9.0-EA-B49的错误出现在这两个版本中。如果目前有一个1.8.0U60的ea版本,我不知道在哪里可以找到它。

 类似资料:
  • 我有一个名为cv的ContentValues[]数组,它进入我的SQLite数据库。为了简单起见,我的数据库有以下3列(每行、日期和湿度的自动递增ID)数据库有3行。下面是一个添加到单行的数据示例。 这会循环3次,每个ContentValue都会被放入我的ContentValue数组中,然后再批量插入到我的数据库中。 我有一个每五分钟从服务器获取新数据的作业。所以我需要这个新数据来替换旧数据,并且

  • 当我发射时 我明白了 我无能为力。我试图pip3卸载东西,但我得到了相同的消息(错误堆栈略有不同)。我能做什么?我应该烧掉电脑然后重新启动一台新的吗?python工作得很好。 完整堆栈:

  • 我与Wildfly上部署的webapp中的一些静态文件(主要是图像)发生了冲突。有时应用程序需要更新其中的一些文件,然后在文件系统中替换这些文件。 这显然是缓存的问题,因为如果我删除以前请求的文件之一并再次请求它,我将得到和StackTrace!

  • 我们有一个名为的实体,它与实体有OneToOne关系。

  • 那么在为方法插入新的主键的情况下,将导致保存,否则将更新该特定实体。因此,在更新期间,我始终需要确保该方法不会为无效ID创建新实体。 因此,为了克服这个问题,我看到许多开发人员在更新之前使用方法调用,以确保给定的主键已经存在。 因此,为了克服这个问题,我想到了一个自定义的更新查询,然后我可以通过在JPararePository中将查询的返回类型声明为int来确定是否执行了该查询。因此,根据我的知识

  • 我正在使用一个selenium脚本,试图下载一个Excel文件并给它一个特定的名称。这是我的代码: 我可以给正在下载的文件一个特定的名称吗? 代码: