我的问题是
java.lang.IndexOutOfBoundsException:索引0无效,大小为0
private List<List<Restaurant.Menu>> menus = new ArrayList<>();
menus.get(0).get(0).setMenuName("asasdasd");
我为错误创建了一个setter但它仍然有问题。我需要添加大约100个菜单名称,1000个foodName
和1000个foodPrize
。我该如何解决?
public class Restaurant
{
@SerializedName("cacheVersion")
@Expose
public String cacheVersion;
@SerializedName("id")
@Expose
public Integer id;
@SerializedName("name")
@Expose
public String name;
@SerializedName("desc")
@Expose
public String desc;
@SerializedName("phones")
@Expose
public List<String> phones = null;
@SerializedName("menus")
@Expose
public List<Menu> menus = null;
@SerializedName("image")
@Expose
public String image;
public 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 class Food
{
@SerializedName("name")
@Expose
public String name;
@SerializedName("desc")
@Expose
public String desc;
@SerializedName("price")
@Expose
public String price;
}
}
在尝试访问它们之前创建对象:
List<List<Restaurant.Menu>> menus = new ArrayList<>();
menus.add(new ArrayList<Restaurant.Menu>()); // create a List for the first level
menus.get(0).add(new Restaurant.Menu()); // create object for the second level
menus.get(0).get(0).setMenuName("asasdasd"); // access them
请注意,没有任何价值可以使Menu
成为内部类。
您可以通过嵌套类来简化:
public static class Menu { ...}
你可能会注意到,List
的List
操作相当麻烦。
作为替代方案,您可以创建自己的类来包装此结构,或者如果它与您的功能需求匹配,则使用第三方库(Guava库或Apache Common)。
作为旁注,我想知道你为什么要分开应该与之相关的事情。
Restaurant
根据你的型号与Menu
有关。
您应该使用包含一组Restaurant
s的Menu
来存储Menu
对象。
您还可以引入参数化构造函数来简化Restaurant
和Menu
创建以及链接菜单添加的流畅方法。
它可以提供客户端代码,例如:
private List<Restaurant> restaurants = new ArrayList<>();
void test() {
Restaurant restaurant = new Restaurant("my restaurant").add(new Menu("a menu"))
.add(new Menu("another menu"));
restaurants.add(restaurant);
Menu menu = restaurants.get(0)
.getMenus()
.get(0);
}
这里Restaurant
所需的变化:
public Restaurant add(Menu menu) {
this.menus.add(menu);
return this;
}
public Restaurant(String name) {
this.name = name;
}
public List<Menu> getMenus() {
return menus;
}
在Menu
这里:
public Menu(String name) {
this.name = name;
}
您可以通过简单地调用来设置值
private List<List<Restaurant.Menu>> menus = new ArrayList<>();
menus.add(new List<Restaurant.Menu> ().add(new Restaurant.Menu().setMenuName("asasdasd")));
俗话说:给一个人一条鱼,你喂他一天,但教一个人钓鱼,他会吃一辈子。那么,异常何时发生?
抛出以指示某种索引(例如数组,字符串或向量)超出范围。
你的问题是由于有一个没有元素的空列表 - 因此这是你的外部列表
大小为0
然后你尝试访问第一个元素:
索引0无效