Java实现twistPlot方法触发List索引越界异常问题排查
问题排查与修复
需求背景
需要实现Story类的twistPlot方法,完成4项指定操作:
- 将teacher对象以别名"Philip"加入
_friends好友圈 - 将Tommy从好友圈中移除
- 移除Pippi的宠物"Herr Nilsson"
- 将Pippi的宠物"Kleiner Onkel"名称修改为"Tiny Uncle"
原有实现的报错情况
最初的实现代码如下:
_friends.getMembers().put("Philip", teacher); _friends.getMembers().remove("Tommy"); _pippi.getPets().remove(0); _pippi.getPets().set(1, new Pet("Tiny Uncle"));
四步全部执行时抛出如下运行时异常:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 1
at java.base/java.util.ArrayList.set(ArrayList.java:473)
at Story.twistPlot(tester.java:84)
测试时发现仅执行前3步、或者跳过第一步执行后3步时程序可以正常运行,只有四步全跑的时候触发越界。
异常根因
初始化Pippi时,她的宠物列表一共2个元素:索引0是"Herr Nilsson",索引1是"Kleiner Onkel"。
执行remove(0)删掉第一个宠物后,列表长度只剩1,原本在索引1位置的"Kleiner Onkel"会自动前移到索引0位置。此时再调用set(1, xxx)访问索引1,已经超出了列表的合法索引范围(长度为1的列表最大合法索引是0),直接触发越界错误。
额外提两个原实现的小问题:
- 第四步没必要新建Pet对象做替换,直接修改原有宠物实例的
name字段就可以满足改名需求,不需要额外创建对象 - 第一步直接往成员Map里put别名的写法是正确的:Group类的
add方法自带「年龄小于18才能加入」的校验,teacher年龄为48,走add方法会直接触发断言失败,直接操作内部Map存储别名刚好符合需求。
正确实现代码
private void twistPlot() { Person teacher = new Person("Martin", 48, new ArrayList<>()); // 1. 以别名Philip添加teacher到好友圈,直接操作Map绕过年龄校验 _friends.getMembers().put("Philip", teacher); // 2. 从好友Map中移除Tommy,Map的key为人物本名 _friends.getMembers().remove("Tommy"); // 3. 移除索引0位置的宠物Herr Nilsson _pippi.getPets().remove(0); // 4. 剩余的Kleiner Onkel已前移到索引0,直接修改名称即可 _pippi.getPets().get(0).name = "Tiny Uncle"; }
内容的提问来源于stack exchange,提问作者Philip730
相关产品推荐
相关产品推荐

