Here's the source from ArrayList
:
The constructor:
public ArrayList(int initialCapacity)
{
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
this.elementData = new Object[initialCapacity];
}
You called set(int, E)
:
public E set(int index, E element)
{
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
Set
calls rangeCheck(int)
:
private void rangeCheck(int index)
{
if (index >= size) {
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
}
It may be subtle, but when you called the constructor, despite initializing an Object[]
, you did not initialize size
. Hence, from rangeCheck
, you get the IndexOutOfBoundsException
, since size
is 0. Instead of using set(int, E)
, you can use add(E e)
(adds e
of type E
to the end of the list, in your case: add(1)
) and this won't occur. Or, if it suits you, you could initialize all elements to 0 as suggested in another answer.