索引0无效,嵌套列表的大小为0

问题描述 投票:-2回答:3

我的问题是

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;
}
}
java android list arraylist indexoutofboundsexception
3个回答
3
投票

在尝试访问它们之前创建对象:

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 { ...}

你可能会注意到,ListList操作相当麻烦。 作为替代方案,您可以创建自己的类来包装此结构,或者如果它与您的功能需求匹配,则使用第三方库(Guava库或Apache Common)。


作为旁注,我想知道你为什么要分开应该与之相关的事情。

Restaurant根据你的型号与Menu有关。 您应该使用包含一组Restaurants的Menu来存储Menu对象。 您还可以引入参数化构造函数来简化RestaurantMenu创建以及链接菜单添加的流畅方法。

它可以提供客户端代码,例如:

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;
}

3
投票

您可以通过简单地调用来设置值

private List<List<Restaurant.Menu>> menus = new ArrayList<>();
menus.add(new List<Restaurant.Menu> ().add(new Restaurant.Menu().setMenuName("asasdasd"))); 

0
投票

俗话说:给一个人一条鱼,你喂他一天,但教一个人钓鱼,他会吃一辈子。那么,异常何时发生?

抛出以指示某种索引(例如数组,字符串或向量)超出范围。

你的问题是由于有一个没有元素的空列表 - 因此这是你的外部列表

大小为0

然后你尝试访问第一个元素:

索引0无效

© www.soinside.com 2019 - 2024. All rights reserved.