【问题标题】:Invalid index 0, size is 0 for a nested list索引 0 无效,嵌套列表的大小为 0
【发布时间】:2018-06-11 12:06:36
【问题描述】:

我的问题是

java.lang.IndexOutOfBoundsException: 无效索引 0,大小为 0

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

我为错误创建了一个设置器,但它仍然存在问题。我需要添加大约 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


【解决方案1】:

你可以通过简单地调用来设置一个值

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

【讨论】:

  • 此代码实例化了一个接口(无效)并在列表中添加了void 返回值(也无效)。
  • new Restaurant.Menu().setMenuName("asasdasd") 这部分需要静态类。我做到了。此外,List ()。这部分想要“列表”是抽象的;无法实例化。对此有何建议?
【解决方案2】:

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

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)来执行此操作(如果它符合您的功能要求)。


作为旁注,我想知道您为什么将应该相关的事物分开。

根据您的模型,RestaurantMenu 相关。
您应该使用包含一组Menus 的Restaurant 来存储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;
}

【讨论】:

  • 这很好用。另外,我不需要此代码的设置器。这会对这种结构造成问题吗?
  • 是的,你可以。作为替代方案,您可以创建自己的类来包装此结构,或者如果它符合您的功能要求,您可以使用第三方库(Guava 库或 Apache Common)来执行此操作。我更新了答案。
  • 我的第一个答案只解决了技术错误。我通过考虑功能方面进行了更新。我希望它会有所帮助。
  • 谢谢。首先,我确实反对,但我无法将其转换为 List
  • 对不起,我想问食物部分。我试过了,但我犯了一个错误。我们创建它直到 menus.get().get()。没关系。为什么食物部分有问题?menus.get(0).get(0).foods.add(new Restaurant.Food());----menus.get(0).get(0).foods.get( 0).name = "sadsad" ----- 和价格
【解决方案3】:

古语有云:授人以鱼,养其一日,授人以渔,食其一生。 那么,什么时候会出现异常呢? ?

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

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

大小为 0

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

无效索引 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-11
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多