Java ArrayList抛出了IndexOutOfBoundsException。为什么?

时间:2013-02-22 05:13:55

标签: java exception arraylist indexoutofboundsexception

这是我目前在项目上取得的进展。我试图实现这个ArrayList的东西,但文件继续trow相同的异常。

import java.util.*;

   public class Numerican{

      public static void main( String [] args ){

        Scanner input = new Scanner(System.in);

        ArrayList<Integer> array = new ArrayList<Integer>(10);

        int count = input.nextInt() * 2;

        while (count > 0){
           array.add( 0 );
           count = count - 1;
           array.add(count, 2);
        }

        array.add(2, input.nextInt());
        System.out.println(array.get(2));

      }
   }

据我了解,= new ArrayList<Integer>(10);会将数组大小设置为10.我做错了吗?

6 个答案:

答案 0 :(得分:7)

= new ArrayList<Integer>(10);

此行将CAPACITY初始化为10,表示内存在后端分配,但就您而言,数组仍为空。

Javadoc -

public ArrayList(int initialCapacity)
    Constructs an empty list with the specified initial capacity.

这就是为什么如果您尝试添加超出add的大小,对ArrayList的调用可能会失败。

P.S。请记住,add函数在使用2参数变量时首先采用索引,然后采用元素。

编辑:

ArrayList有两个不同的成员变量,大小容量。容量是分配的内存量,大小是程序员插入的元素数量。

此处,容量= 10,大小= 0;

答案 1 :(得分:0)

如果索引超出范围(索引&lt; 0 || index&gt; size())将抛出IndexOutOfBoundsException。
所以我认为你正在访问索引&gt;列表的大小()。

size()===&gt;返回此列表中的元素数。

array.add(2,input.nextInt());当您的列表大小为1时,这是可能的例外...

答案 2 :(得分:0)

根据the javadocs

  

构造一个具有指定初始容量的空列表。

请注意,ArrayList 为空(即不包含任何项目)。该值表示ArrayList的 capacity ,它是在必须分配更多内存之前可以添加的元素数。

另一方面,调用add()实际上会向ArrayList添加一个项目。在您的示例中,array.add( 0 );在列表末尾添加0array.add(count, 2);在索引2添加count。我怀疑问题是count不是ArrayList中的有效索引。您应该通过插入SOP或使用调试器来检查它的值。

答案 3 :(得分:0)

嘿,好像你的问题是因为行

array.add(count, 2); 

在索引计数

处添加2

例如,您的输入大小为5,然后array.add(9,2);,此时数组大小仅为1,因为容量和大小是ArrayList的两个不同参数。因此,您可以使用for循环而不是while来插入值

for(int i=0; i<count;i++)
{
array.add(i,2);
}

答案 4 :(得分:0)

count maybe >= 10,也许源代码可以回答你的问题:

public void add(int index, E element) {
    rangeCheckForAdd(index);

    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    elementData[index] = element;
    size++;
}

rangeCheckForAdd():

/**
 * A version of rangeCheck used by add and addAll.
 */
private void rangeCheckForAdd(int index) {
    if (index > size || index < 0)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

答案 5 :(得分:0)

根据我对ArrayList的理解,您需要在顺序索引中将项添加到列表中 即如果尚未填写1到6,则无法将项目添加到第7个索引位置。

ArrayList.add(indexPosition,element);

如果您向列表添加元素,从indexPosition 0开始,每次将indexPosition增加1,它应该可以正常工作。

实施例
int i = 0;
(while i < 10){
array.add(i, numberToAdd);
i++;
}