无法添加到数组列表

时间:2013-05-08 19:34:10

标签: java list arraylist indexoutofboundsexception

我有一个最奇怪的问题,可能是一个简单的解决方案。

我创建并初始化了一个列表,然后继续创建列表类型的4个对象。在这些构造函数中,它们将自己放在列表中。或者至少是应该的。我总是得到一个出界的例外,我无法弄清楚为什么。我将列表设置为大小为402(对于所有可能的VK值),但在控制台和调试中它总是说它的大小为0,无论我设置多大还是空......

public class InputHandler implements KeyListener
{

public static List<Key> keyList = new ArrayList<Key>(KeyEvent.KEY_LAST);

public Key up = new Key(KeyEvent.VK_UP);
public Key down = new Key(KeyEvent.VK_DOWN);
public Key left = new Key(KeyEvent.VK_LEFT);
public Key right = new Key(KeyEvent.VK_RIGHT);


public class Key
    {

    public int keyCode;

    public Key(int defaultCode)
    {
        this.keyCode = defaultCode;
        keyList.add(keyCode,this);
    }

    public Key reMapKey(int newKey)
    {
        keyList.remove(keyCode);
        keyList.set(newKey, this);
        this.keyCode = newKey;
        return this;
    }

}

}

代码还有更多,但我尝试了SSCCE。

来自控制台的唯一值信息是:

Exception in thread "RogueLoveMainThread" java.lang.IndexOutOfBoundsException: Index: 38, Size: 0

为我的愚蠢道歉

2 个答案:

答案 0 :(得分:4)

您创建了一个新的ArrayList,其容量为402,但在构造函数调用后仍然有 size 为0。来自docs of the constructor call you're using

  

public ArrayList(int initialCapacity)

     

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

     

<强>参数:
     initialCapacity - 列表的初始容量

来自ArrayList本身的文档:

  

每个ArrayList实例都有容量。容量是用于存储列表中元素的数组的大小。它始终至少与列表大小一样大。当元素添加到ArrayList时,其容量会自动增加。

容量不是的大小。

所以,有些选择:

  • 使用空条目填充列表,直到 获得所需的大小
  • 使用数组而不是列表(毕竟,你只需要它是一个固定的大小,对吗?)
  • 使用Map<Integer, Key>代替

答案 1 :(得分:3)

keyList.add(keyCode, this)插入keyCode位置。由于您的列表仍为空(大小为0),因此无法在任何大于0的位置插入。

您可能希望将地图代码添加到密钥中,是吗?这有一个Map<K, V>

static Map<Integer, Key> keyMap = new TreeMap<>();

public Key(int defaultCode) {
    keyMap.add(keyCode, this);
}

如果您的代码需要密钥,则可以从Map收到密钥,如下所示:

keyMap.get(keyCode);