You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决AWT-EventQueue-0线程IndexOutOfBoundsException索引-1越界异常

问题根因排查

一共4个核心问题导致你出现报错和逻辑异常:

  • queryData方法判断条件错误:列表下标从0开始,你写的position > 0会直接过滤掉下标为0的匹配结果,导致匹配到第一条数据时直接返回null
  • 调用findData参数不匹配:你定义的findData需要传入3个参数,修改逻辑中直接传入Vaccine类型的cz,如果没有对应重载方法或者重载实现错误,会直接返回-1
  • 缺少索引合法性校验:拿到findData返回的结果后没有判断是否为-1,直接传给ArrayList.set()方法,当找不到匹配数据时就会抛出你遇到的索引越界异常
  • 修改逻辑存在设计问题:遍历全量列表每次都用表单的同一个值更新数据,会导致所有数据被覆盖为同一条,且每次循环都刷表写文件,性能极低

修复方案

1. 修复queryData方法

public Vaccine queryData(VaccineName vaccineType, VaccinationCentre vaccineCentre, int vaccineStock){
    int position = findData(vaccineType, vaccineCentre, vaccineStock);
    // 将 >0 改为 >=0 兼容下标为0的匹配结果
    if(position >= 0){
        System.out.println(DataIO.vaccine.get(position));
        return DataIO.vaccine.get(position);
    }
    return null;
}

2. 修正findData调用逻辑

// 传入正确的三个参数调用原有findData
Vaccine cz = queryData(DataIO.vaccine.get(i).getVaccineType(),DataIO.vaccine.get(i).getVaccineCentre(),DataIO.vaccine.get(i).getVaccineStock());
// 先判断cz是否为null
if(cz == null){
    System.out.println("未查询到匹配数据,跳过更新");
    continue;
}
int found = findData(cz.getVaccineType(), cz.getVaccineCentre(), cz.getVaccineStock());

3. 新增索引合法性校验

if(found >= 0){
    DataIO.vaccine.set(found, v);
}else{
    System.out.println("索引非法,跳过更新");
}

4. 优化修改逻辑

如果你的需求是更新用户在JTable选中的单条数据,不需要遍历全量列表,直接拿到选中行的原始数据查询位置更新即可;如果是批量更新,把DataIO.write()、表格刷新逻辑移到循环外面,避免重复IO和UI渲染。

内容的提问来源于stack exchange,提问作者user16916070

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:24:03