在我的数组列表中导致此ArrayOutOfBoundsException的原因是什么?

时间:2014-06-24 14:45:14

标签: java arraylist hashtable indexoutofboundsexception

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

6 个答案:

答案 0 :(得分:4)

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

创建一个空的arrayList。

set方法

  

使用指定的元素
替换此列表中指定位置的元素   抛出:IndexOutOfBoundsException - 如果index超出范围(index < 0 || index >= size()

所以

bucket.set( i, null );

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

你想要的是add方法:

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

null添加到ArrayList的末尾。

答案 1 :(得分:2)

您需要第一眼添加而不是设置

查看doc of set() method

  

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

您遇到了条件index >= size()

答案 2 :(得分:1)

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

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

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

如果将列表中的元素添加到您想要的内容,则应使用add而不是set

答案 3 :(得分:0)

您的ArrayList(存储桶)中没有任何元素 - bucket.set替换元素,它不会插入元素。

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

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

答案 4 :(得分:0)

我认为,相当明显的是,当您尝试访问其上方的索引(最多58个)时,您的ArrayList是使用默认容量(10)创建的。

答案 5 :(得分:0)

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

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

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

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

在此处查找文档:

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