- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的老师教我,当我更新 Observable List 中的对象时,它会自动检测更改并通知观察者。但是,当我尝试更新列表中的某个人时,它会抛出索引越界异常。我不知道出了什么问题。
private ObservableList<ClubPersoon> personen;
public void updatePersoon(ClubPersoon editPerson) {
GenericDaoJpa.openPersistency();
GenericDaoJpa.em.getTransaction().begin();
UpdatePersoonValues(editPerson);
GenericDaoJpa.em.getTransaction().commit();
GenericDaoJpa.closePersistency();
}
private void UpdatePersoonValues(ClubPersoon currentLid) {
int index = personen.indexOf(personen.stream().filter(p -> p.getId() == currentLid.getId()).findFirst());
personen.get(index).setVoornaam(currentLid.getVoornaam());
personen.get(index).setAchternaam(currentLid.getAchternaam());
personen.get(index).setEmail(currentLid.getEmail());
personen.get(index).setEmailOuders(currentLid.getEmailOuders());
personen.get(index).setEmail(currentLid.getEmail());
personen.get(index).setTelefoonNummer(currentLid.getTelefoonNummer());
personen.get(index).setGeboorteDatum(currentLid.getGeboorteDatum());
personen.get(index).setBackupTelefoon(currentLid.getBackupTelefoon());
personen.get(index).setScore(currentLid.getScore());
personen.get(index).setGeslacht(currentLid.getGeslacht());
personen.get(index).setRijksregisternummer(currentLid.getRijksregisternummer());
personen.get(index).setRol(currentLid.getRol());
personen.get(index).setGraad(currentLid.getGraad());
personen.get(index).setLocatie(currentLid.getLocatie());
personen.get(index).setVerwachteDagen(currentLid.getVerwachteDagen());
personen.get(index).setActiviteiten(currentLid.getActiviteiten());
}
这是错误的路径:
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
at java.base/java.util.Vector.elementData(Vector.java:761)
at java.base/java.util.Vector.get(Vector.java:782)
at javafx.base/com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:89)
at domein.Club.UpdatePersoonValues(Club.java:143)
at domein.Club.updatePersoon(Club.java:80)
at domein.DomeinController.updatePersoon(DomeinController.java:113)
at gui.PersoonDetailController.handleBtnOpslaan(PersoonDetailController.java:186)
最佳答案
如 List.indexOf(Object)
的文档中所述,该方法返回 -1
如果List
不包含作为参数传递的对象。试图访问 List
通过索引 -1
总是会导致 IndexOutOfBoundsException
(或 ArrayIndexOutOfBoundsException
,因为您似乎在包装 Vector
)。
也就是说,您当前实现方法的方式总是导致-1
被退回。注意 indexOf
的签名;它接受 Object
, 不是 E
.这意味着您可以将任何您想要的对象传递给该方法,您的代码将被编译。现在看一下 Stream.findFirst()
的返回类型—它返回 Optional<T>
.换句话说,您的代码等同于:
Optional<ClubPerson> optional = personen.stream().filter(p -> p.getId() == currentLid.getId()).findFirst();
int index = personen.indexOf(optional);
...
作为personen
是一个 ObservableList<ClubPerson>
, 它不能包含任何 Optional<ClubPerson>
元素。
目前还不清楚您为什么要尝试查找 ClubPerson
在列表中,然后查询该元素的索引,只是简单地再次使用所述索引访问列表以修改 ClubPerson
你已经找到了。为什么不直接修改 ClubPerson
直接地?你甚至可以使用 Optional.ifPresent(Consumer)
.
personen.stream().filter(p -> p.getId() == currentLid.getId()).findFirst().ifPresent(p -> {
p.setVoornaam(currentLid.getVoornaam());
p.setAchternaam(currentLid.getAchternaam());
p.setEmail(currentLid.getEmail());
p.setEmailOuders(currentLid.getEmailOuders());
p.setEmail(currentLid.getEmail());
p.setTelefoonNummer(currentLid.getTelefoonNummer());
p.setGeboorteDatum(currentLid.getGeboorteDatum());
p.setBackupTelefoon(currentLid.getBackupTelefoon());
p.setScore(currentLid.getScore());
p.setGeslacht(currentLid.getGeslacht());
p.setRijksregisternummer(currentLid.getRijksregisternummer());
p.setRol(currentLid.getRol());
p.setGraad(currentLid.getGraad());
p.setLocatie(currentLid.getLocatie());
p.setVerwachteDagen(currentLid.getVerwachteDagen());
p.setActiviteiten(currentLid.getActiviteiten());
});
如果元素不在列表中是一个错误,您可以改为使用 Optional.orElseThrow(Supplier)
之类的东西或 Optional.orElseThrow()
(Java 10+)。
ClubPerson p = personen.stream().filter(p -> p.getId() == currentLid.getId())
.findFirst()
.orElseThrow(); // throws NoSuchElementException if element not found
// set properties of "p"...
关于Java 在编辑 observableList 时抛出 IndexOutOfBounds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56115123/
对于我的 CS 类,我必须编写一个从 LinkedList 扩展的 Stacks 接口(interface)。但是,我的 peek() 方法显然有一个错误。当我将其实现到我的其他程序之一时,我返回一个
每次我尝试运行此方法 private void resetOdds() { mOdds[1] = 0.10; mOdds[2] = 0.25; mOdds[3] = 0.35;
我正在学习Java语言,我正在尝试制作MasterMind游戏。我在尝试编译时收到以下错误,在尝试调试代码后,我找不到错误: Exception in thread "main" java.lang.
下面的代码旨在获取一个 byte[] 和其他一些东西(参见它提供的代码)。然后它构建一个具有一定长度的数据包并返回它。我的问题是,当我将文件读入主程序时,我需要数据报包的缓冲区为剩余要发送的字节数(如
我正在做一项作业,需要计算位置 (x,y) 周围像素的 NxN 平均值。 当我传入一个大小变量时,我试图创建一个通用函数来执行此操作。 我只允许大小或 NxN 矩阵为 3x3、5x5 或 7x7。 我
这个问题在这里已经有了答案: Captured variable in a loop in C# (10 个答案) 关闭 3 年前。 我有两个代码循环片段,后者按预期工作,而前者抛出异常。为什么 f
我正在尝试统计一个计数数组,以跟上一组 50 个选择,其中每个选择有三个选项。根据我的导师的说法,计数数组应该有 150 个元素 (3 x 50 = 150)。但我在第 55 行不断收到 IndexO
我正在尝试构建一棵区间树。在这一部分中,我必须按升序排列所有左端点,并按升序排列所有右端点,并将它们放入单点列表中(无重复)。但是,当我尝试将正确的端点合并到点列表中时,我不断收到 indexOutO
我有一个看起来像这样的文本文件: Aaaaa 0.55 2 bbb 2.1 0.25 ccccc 71 21 ..... ..
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 7 年前。 此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic在这里
这个问题已经有答案了: What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it? (25 个回答)
我正在尝试计算金字塔的最小自下而上路径总和。我正在从文本文件读取输入。 我的文本文件示例: 5 6 6 5 3 5 8 3 9 2 1 4 7 9 2 7 第一行告知程序有关金字塔的大小,其他行正在组
我收到以下错误。 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 at ja
有人能告诉我为什么我总是收到 IndexOutOfBoundsException 吗? Cheeses 只是一个包含一组字符串的数组。Alphabets 是一个包含单个字符串变量的类。 我正在尝试编写
我正在编写一个程序,该程序读取文件,然后检查是否有相同数量的右括号和左括号。因此,我所做的是使用 FileInputStream 和 Scanner 类来读取文件并将每个字符存储在 ArrayList
我正在尝试手动引发数组的索引越界异常。我知道要抛出常规异常,我可以执行以下操作: if(x>array.length){ throw new Exception("Bad choice!"); } 但
您好,我正在为编程类(class)编写一个程序,我得到: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 18
你好,我正在尝试编写 QuickSort 代码,但我总是遇到索引越界?我的代码如下: public class QuickSort { public void quickSort(ArrayL
到目前为止,这让我很困惑。 尝试运行此特定查询时,我不断收到 CursorIndexOutOfBounds。 Cursor c = db.rawQuery("SELECT * FROM tab
所以,我正在做一项作业,让一个类(class)接收为 Conway 的 Game Of Life 设置的文本文件。我已经写了所有东西,但是很难测试,因为我的错误处理很糟糕。我已经阅读了关于 try、c
我是一名优秀的程序员,十分优秀!