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
相关产品推荐
相关产品推荐

