1

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

我已经创建并初始化了一个列表,然后继续创建 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

为我的愚蠢道歉

4

2 回答 2

5

您已经创建了ArrayList一个容量为 402 的 new,但在构造函数调用之后它的大小仍然为 0。您正在使用的构造函数调用的文档中

public ArrayList(int initialCapacity)

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

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

从它自己的文档中ArrayList

每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小。它总是至少与列表大小一样大。随着元素被添加到 ArrayList,它的容量会自动增长。

容量不是大小。

所以,一些选择:

  • 用空条目填充列表,直到获得所需的大小
  • 使用数组而不是列表(毕竟,您只需要它是固定大小的,对吧?)
  • 改用Map<Integer, Key>a
于 2013-05-08T19:37:11.790 回答
4

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);
于 2013-05-08T19:38:25.443 回答