【问题标题】:Java ArrayList is throwing IndexOutOfBoundsException. Why?Java ArrayList 正在抛出 IndexOutOfBoundsException。为什么?
【发布时间】:2013-02-07 15:58:50
【问题描述】:

这是我目前在一个项目上的进展。我正在尝试实现这个 ArrayList 的东西,但文件继续抛出相同的异常。

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&lt;Integer&gt;(10); 会将数组大小设置为 10。我做错了什么吗?

【问题讨论】:

  • 哪一行导致错误?
  • 我想问题出在这行 array.add(count, 2); 上。是吗?
  • @codeMan 这也是我的猜测,仔细观察后。
  • 我不这么认为。我尝试删除 while 循环,但它仍然给了我同样的异常。
  • @Alexander array.add(2, input.nextInt());这是可能的例外...当计数为 1 时。您访问的列表大小超过了 2。

标签: java exception arraylist indexoutofboundsexception


【解决方案1】:
= new ArrayList<Integer>(10);

这一行将 CAPACITY 初始化为 10,这意味着内存是在后端分配的,但就你而言,数组仍然是空的。

Javadoc -

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

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

附言请记住,add 函数在使用 2 参数变体时先获取索引,然后再获取元素。

编辑:

ArrayList 有 2 个不同的成员变量,sizecapacity。容量是分配了多少内存,大小是程序员插入了多少元素。

这里,容量 = 10,大小 = 0;

【讨论】:

  • 我想我还是不明白为什么 while 循环不会添加到数组中。即使计数小于 10(数组大小)
  • @Alexander 您需要了解 ArrayList 的工作原理。它有 2 个成员,大小和容量。容量是分配了多少内存,大小是程序员插入了多少元素
  • 这里的数组 CAPACITY 是 10,正如 javadoc 所揭示的,初始大小是 0
  • 那么,您能说明一下可能的解决方案吗?
  • @Alexander 没有特定索引就不能添加吗?如果没有,您可以编写一个循环,在此代码之前添加 10 个元素。
【解决方案2】:

根据the javadocs

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

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

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

【讨论】:

    【解决方案3】:

    count maybe &gt;= 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));
    }
    

    【讨论】:

      【解决方案4】:

      如果索引超出范围 (index size()) 将抛出 IndexOutOfBoundsException。
      所以我认为你正在访问列表的 index > size() 。

      size() ===> 返回此列表中的元素数。

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

      【讨论】:

      • @asifsid88 我已经提到了问题的确切原因和原因......你还想要什么??
      • @asifsid88 我没明白你的意思;如果没有那个 while 循环,他也能看到异常 rit ??
      【解决方案5】:

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

      ArrayList.add(indexPosition, element);

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

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

      【讨论】:

        【解决方案6】:

        嘿,你的问题似乎是因为这条线

        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);
        }
        

        【讨论】:

          猜你喜欢
          • 2021-12-20
          • 2016-03-22
          • 2016-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-03
          • 1970-01-01
          相关资源
          最近更新 更多