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.