Java列表错误超出范围

时间:2013-03-16 05:38:18

标签: java list outofrangeexception

    import java.util.*;

    class A
    {
        private ArrayList <B> bList;
        private Random generator = new Random();

        A(List<B> initialList)
        {
            bList = new ArrayList<B> ();
            int listSize = initialList.size();
            bList.ensureCapacity(listSize);

            for (B b : initialList)
            {
                int bIndex = generator.nextInt(listSize);
                bList.add(bIndex , b);
            }
        }
    }

    class B
    {
    }

当我插入blist.add(bIndex , b);

时,我最终遇到了一个超出范围错误的新错误

调试后,看来ensureCapacity无法正常工作。

3 个答案:

答案 0 :(得分:2)

查看add方法的文档:

  

IndexOutOfBoundsException - 如果索引超出范围(索引&lt; 0 || index&gt; size())

将元素放入列表中可能会导致列表出现漏洞的位置是没有意义的。

ensureCapacity只为这么多元素腾出空间。这并不意味着他们确实存在。

通过此更改,它应该有效:

int bIndex = generator.nextInt(bList.size()+1);

答案 1 :(得分:0)

容量与大小不同。您确保新列表具有足够的内部容量用于add调用所使用的索引,但随后您调用add,其索引(可能且可能)大于列表的{{1 }}

答案 2 :(得分:0)

您将随机收到此错误。因为您使用随机类创建索引(bIndex)。它将在您提到的列表大小中生成索引(int bIndex = generator.nextInt(listSize))。有时它会生成大于0的随机数。那时你会得到这个错误。如果它创建0,那么它不会给出错误。

您可以使用for循环而不是foreach。

for (int i = 0; i < listSize; i++) {
   B b = initialList.get(i);
   bList.add(i, b);
   System.out.println(bList.toString());
}