我有一个最奇怪的问题,可能是一个简单的解决方案。
我创建并初始化了一个列表,然后继续创建列表类型的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
为我的愚蠢道歉
答案 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);