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

Java学生课程管理系统添加学生后删除触发IndexOutOfBoundsException错误

问题根因定位

本次触发的IndexOutOfBoundsException核心原因是student.removeStudent()方法的执行逻辑顺序错误,和报错栈的触发链路完全匹配:

  • 方法在遍历列表定位到匹配的学生索引x后,先依次调用所有存储学生信息的列表的remove(x)接口执行删除操作:每次删除操作完成后,所有对应列表的长度会直接减1,原索引x如果位于列表尾部,删除后x就会成为超出合法范围的越界索引
  • 完成所有删除动作后,代码没有重新获取合法位置的元素,直接使用原来的索引值x调用FName.get(x)、SName.get(x)拼接触发删除成功的提示文本,这时候就会触发越界报错。
故障触发的场景匹配
  • 当没有通过菜单选项2手动添加学生时,程序从students.txt读取的学生列表长度为19,合法索引范围是0~18。此时只要删除的不是列表最后一位(索引18)的学生,删除后索引x对应的位置因为后续元素前移依然存在合法值,不会触发越界,看起来功能正常。
  • 通过选项2添加1个学生后,列表长度变为20,合法索引范围扩展到019。此时如果定位到的匹配学生刚好是最后一位(也就是新加的、索引为19的学生),执行删除后列表长度会收缩为19,合法索引范围变为018;代码此时拿着原索引19去取值,就会完全匹配报错信息里的Index: 19, Size: 19异常。
修复方案

删除操作的逻辑调整为:先在删除前取出匹配位置的学生姓名暂存,再执行列表删除动作,最后打印暂存的姓名作为提示信息即可,示例修正逻辑:

// 定位到匹配的x位置后执行以下逻辑
found = true;
// 先取待删除的姓名暂存,此时还未执行删除,索引完全合法
String removedFName = FName.get(x);
String removedSName = SName.get(x);
// 再执行所有列表的删除操作
FName.remove(x);
SName.remove(x);
DOB.remove(x);
Address.remove(x);
Gender.remove(x);
// 打印暂存的姓名,不再直接用越界的x取值
System.out.print(removedFName + " " + removedSName + " has been removed from the course");

附带发现的非报错相关的代码问题:

  • addStudent()方法中使用Fname!=""判断输入为空是错误逻辑,Java中字符串比较不能直接用!=/==,应该改为"".equals(Fname)判断是否为空
  • Main类中定义的静态数组students、course从未被实际使用,属于冗余代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 08:15:02