Java超出范围错误

时间:2013-11-09 07:43:18

标签: java data-structures

为什么以下内容会返回IndexOutOfBoundsException? (索引5,大小0)

gridList = new ArrayList<Integer>(9);
gridList.add(5, 2);

我的印象是构造函数调用将我的arraylist初始化为大小。

我对java很新,所以道歉。

5 个答案:

答案 0 :(得分:6)

调用该构造函数只是指定初始容量,但对ArrayList的大小没有影响(在添加任何内容之前,大小始终为零)。这在docs中进行了解释,并通过打印出ArrayList:

来证明
ArrayList<Integer> gridList = new ArrayList<Integer>(9);
System.out.println(gridList);

Output: []

如果要初始化包含9个整数的ArrayList(例如,9个零),请尝试“convenience implementation”:

ArrayList<Integer> gridList = new ArrayList<Integer>(Collections.nCopies(9, 0));
System.out.println(gridList);

Output: [0, 0, 0, 0, 0, 0, 0, 0, 0]

正如您所看到的,这会在初始化期间使用值填充ArrayList,因此您现在可以在没有gridList.add(5, 2);的情况下调用IndexOutOfBoundsException

答案 1 :(得分:4)

ArrayListinitialized with a capacity的9,但列表为空。因此,您无法在位置5添加元素,因为列表中不存在此位置。

答案 2 :(得分:3)

请遵循ArrayList的源代码,可以看出大小和容量是不同的概念。 checkBoundInclusive()方法将indexsize而不是capacity进行比较。

public ArrayList(int capacity)
   {
     // Must explicitly check, to get correct exception.
     if (capacity < 0)
       throw new IllegalArgumentException();
     data = (E[]) new Object[capacity];
   }


   public void add(int index, E e)
   {
      checkBoundInclusive(index);
      modCount++;
      if (size == data.length)
        ensureCapacity(size + 1);
     if (index != size)
        System.arraycopy(data, index, data, index + 1, size - index);
      data[index] = e;
      size++;
    }


    private void checkBoundInclusive(int index)
    {
      // Implementation note: we do not check for negative ranges here, since
      // use of a negative index will cause an ArrayIndexOutOfBoundsException,
      // a subclass of the required exception, with no effort on our part.
      if (index > size)
        throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
                                            + size);
    }

答案 3 :(得分:2)

它仍然是一个空列表(大小为1,只有可用的索引为0)。只是容量为9.容量达到容量后,ArrayList将会扩展。

注意:尺寸和容量是两回事。

答案 4 :(得分:1)

正如其他人在这种情况下指出的那样,你在第5位输入了一个元素,但你什么也没有,之前没有任何元素 - 看这里:

    ArrayList<Integer>  g = new ArrayList<Integer>(9);
    g.add(0, 10);
    g.add(1, 20);
    g.add(2, 30);
    g.add(3, 40);

    for(Integer v: g) System.out.print(v + " ");
    System.out.println();

    g.add(2,99);

    for(Integer v: g) System.out.print(v + " ");
    System.out.println();

    g.add(88); // use this to just push value at the end

    for(Integer v: g) System.out.print(v + " ");
    System.out.println();

的产率:

10 20 30 40 
10 20 99 30 40 
10 20 99 30 40 88