【问题标题】:What is causing this ArrayOutOfBoundsException in my array list?是什么导致我的数组列表中出现此 ArrayOutOfBoundsException?
【发布时间】:2014-08-14 21:24:30
【问题描述】:
import java.util.*;
import java.util.ArrayList;

class MyHashTable<K extends Comparable<K>, E> {

    private ArrayList<Entry<K,E>> bucket = new ArrayList<Entry<K,E>>();
    private int bucketSize;
    private int collisionCount = 0;

    // Constructor that takes number of buckets as input
    public MyHashTable( int len ) 
    {
        this.bucketSize = len;
        for ( int i = 0; i < len; i++ ) 
        {
            bucket.set( i, null ); //ERROR APPEARS ON THIS LINE
        }
    }

当我从另一个方法调用时被唤起:

MyHashTable<MyString, AnimalRecord> linearProbing = new MyHashTable<MyString, AnimalRecord>(59);
linearProbing.put( lion.name, lion );

【问题讨论】:

    标签: java arraylist hashtable indexoutofboundsexception


    【解决方案1】:
    private ArrayList<Entry<K,E>> bucket = new ArrayList<Entry<K,E>>();
    

    创建一个空的arrayList。

    set 方法

    将此列表中指定位置的元素替换为指定元素
    抛出:IndexOutOfBoundsException - 如果 index 超出范围 (index &lt; 0 || index &gt;= size())

    所以

    bucket.set( i, null );
    

    尝试将 null 设置为 ith 元素(从 0 开始)。但是 arraylist 是空的,这就是你得到异常的原因。

    你想要的是add方法:

    for ( int i = 0; i < len; i++ ) 
    {
        bucket.add(null);
    }
    

    null 添加到ArrayList 的末尾。

    【讨论】:

    • 我不确定是不是这个错误(主要是因为我刚刚添加了一个大小并且错误仍然存​​在) - 但是列表不能随着添加而增长 - 即使大小为空?跨度>
    • @user3771739 列表add一起增长。它不会随着set 而增长。您需要在使用 set 的地方使用 add
    • 会是第 10 名而不是第 1 名吗?初始化中有一个默认容量。 developer.classpath.org/doc/java/util/ArrayList-source.html
    • @MingtaoZhang capacitysize 不同。 ArrayList 由数组支持,capacity 是该数组的大小。 Java 管理数组(增加/减少大小等)并且大部分是透明的。 sizeArrayList 中元素的实际数量。 capacity &gt;= size.
    【解决方案2】:

    您需要添加而不是设置一见钟情。

    doc of set() method

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

    你遇到了条件index &gt;= size()

    【讨论】:

      【解决方案3】:

      最初,ArrayList 是空的,当您创建它的新实例时:

      private ArrayList<Entry<K,E>> bucket = new ArrayList<Entry<K,E>>();
      

      当您在ArrayList 上调用set 方法时,您正在尝试替换现有元素,该元素未找到,因为列表为空。

      如果你想要将元素添加到列表中,你应该使用add,而不是set

      【讨论】:

        【解决方案4】:

        您的 ArrayList (bucket) 中没有任何元素 - bucket.set 替换了一个元素,它没有插入一个元素。

        http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#set(int,%20E)

        调用 ArrayList.add() 代替,因为这会将一个元素附加到数组的末尾。

        【讨论】:

          【解决方案5】:

          我认为很明显,您的 ArrayList 是使用默认容量 (10) 创建的,而您尝试访问它上面的索引(最多 58 个)。

          【讨论】:

            【解决方案6】:

            查看类 ArrayList 的 Java 文档以及您正在使用的方法:

            方法set“用指定元素替换此列表中指定位置的元素。”

            在您的方法调用时,您没有元素为 59 的 ArrayList。使用 ArrayList() Standard-Constructor 构造的 ArrayList 的初始大小为 10。

            你可以使用构造函数ArrayList(int initialCapacity)

            在此处查找文档:

            http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-08-28
              • 1970-01-01
              • 2021-10-28
              • 2015-02-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多