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

Java索引越界异常解决:批量添加菜单与菜品信息

解决java.lang.IndexOutOfBoundsException并实现批量添加菜单与菜品

先聊聊你遇到的异常问题

你调用menus.get(0).get(0).setMenuName("asasdasd")时触发IndexOutOfBoundsException,核心原因特别直白:你声明的menus是一个空的ArrayList,里面连一个Menu对象都没有,自然没法通过get(0)取出元素。Setter方法本身没问题,但前提是你得先有可操作的对象才行。

快速修复单个元素的访问问题

如果你只是想先让这段代码不报错,可以先手动往menus里添加一个Menu实例:

Restaurant restaurant = new Restaurant();
// 确保menus列表已初始化(如果是自己创建的实例,你已经new ArrayList<>()了,但如果是接口返回的可能为null,最好再确认下)
if (restaurant.menus == null) {
    restaurant.menus = new ArrayList<>();
}
// 创建Menu实例(注意:因为Menu是非静态内部类,必须通过Restaurant实例来创建)
Restaurant.Menu firstMenu = restaurant.new Menu();
restaurant.menus.add(firstMenu);
// 现在就可以安全调用setMenuName了
restaurant.menus.get(0).setMenuName("asasdasd");

不过更推荐把Menu和Food改成静态内部类,这样不需要依赖Restaurant实例就能创建对象,代码更简洁:

public class Restaurant {
    // ... 原有字段
    public static class Menu { // 改成静态内部类
        @SerializedName("name") @Expose public String name;
        @SerializedName("foods") @Expose public List<Food> foods = null;
        public void setMenuName(String namex) { this.name = namex; }
    }
    public static class Food { // 改成静态内部类
        @SerializedName("name") @Expose public String name;
        @SerializedName("desc") @Expose public String desc;
        @SerializedName("price") @Expose public String price;
    }
}

改完后创建Menu就可以直接写:Restaurant.Menu menu = new Restaurant.Menu();


实现批量添加100个菜单+1000个菜品

接下来是你需要的批量添加逻辑,我们可以通过嵌套循环来实现(假设100个菜单,每个菜单下10个菜品,刚好凑够1000个):

Restaurant restaurant = new Restaurant();
// 初始化menus列表,避免null
restaurant.menus = new ArrayList<>();

// 批量创建100个菜单
for (int menuIndex = 1; menuIndex <= 100; menuIndex++) {
    Restaurant.Menu menu = new Restaurant.Menu();
    // 设置菜单名称
    menu.setMenuName("菜单" + menuIndex);
    
    // 为当前菜单创建10个菜品
    List<Restaurant.Food> foodList = new ArrayList<>();
    for (int foodIndex = 1; foodIndex <= 10; foodIndex++) {
        Restaurant.Food food = new Restaurant.Food();
        food.name = "菜品" + menuIndex + "-" + foodIndex;
        food.desc = "这是" + food.name + "的详细描述";
        food.price = String.valueOf((menuIndex + foodIndex) * 8.5); // 示例价格,可根据需求调整
        foodList.add(food);
    }
    // 把菜品列表绑定到菜单上
    menu.foods = foodList;
    // 将菜单添加到餐厅的菜单列表中
    restaurant.menus.add(menu);
}

额外的注意事项

  • 如果你的menus是从接口返回的(比如通过Gson解析JSON),一定要先做非空和非空列表判断:
    if (restaurant.menus != null && !restaurant.menus.isEmpty()) {
        // 再去操作列表里的元素
    }
    
  • 如果需要更灵活的批量数据(比如不同菜单下的菜品数量不一样),可以提前准备好数据集合(比如用Map存菜单名对应的菜品列表),再循环添加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:46:09