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

