【问题标题】:Java List Errors Out of RangeJava 列表错误超出范围
【发布时间】:2013-03-16 05:38:17
【问题描述】:
    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 似乎无法正常工作。

【问题讨论】:

  • 你到底在做什么?以随机顺序对 initialList 进行排序?
  • 你应该在这里发布堆栈跟踪。
  • 嗯...不确定您要使用ensureCapacity 完成什么。你在做类似this的事情吗?

标签: java list outofrangeexception


【解决方案1】:

查看add方法的文档:

IndexOutOfBoundsException - 如果索引超出范围 (index size())

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

ensureCapacity 为这么多元素腾出了空间。这并不意味着他们真的在那里。

通过此更改,它应该可以工作:

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

【讨论】:

    【解决方案2】:

    容量与大小不同。您确保新列表有足够的内部容量用于您用于add 调用的索引,但随后您调用add 时的索引(可能且可能)大于列表的size

    【讨论】:

      【解决方案3】:

      您将随机收到此错误。因为您使用随机类创建索引(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());
      }
      

      【讨论】:

        猜你喜欢
        • 2017-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-02
        • 2016-01-06
        相关资源
        最近更新 更多