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

时间:2018-01-01 13:02:59

标签: java android list arraylist indexoutofboundsexception

我的问题是

  

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

3 个答案:

答案 0 :(得分:3)

您只需拨打

即可设置值
SELECT 'Date',
       'Close Price',
       (('Close Price'/lag('Close Price', 1) OVER (ORDER BY 'Date')) - 1) * 100 AS percentage_change
FROM treasury
ORDER BY 'Date';

答案 1 :(得分: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 { ...}

正如您所注意到的,List List操作相当麻烦。
作为替代方案,如果它符合您的功能要求,您可以创建自己的类来包装此结构或使用第三方库(Guava库或Apache Common)。

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

根据您的型号,

RestaurantMenu相关 您应该使用包含一组Restaurant的{​​{1}}来存储Menu个对象。
您还可以引入参数化构造函数来简化MenuRestaurant创建以及链接菜单添加的流畅方法。

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

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

答案 2 :(得分:0)

正如那句老话:给一个人一条鱼,你喂他一天,但教一个人钓鱼,他会吃一辈子。那么,什么时候会发生异常?

  

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

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

  

尺寸为0

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

  

索引0无效