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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:57:16