如何解决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
相关产品推荐
相关产品推荐

