【问题标题】:Can't add to an array list无法添加到数组列表
【发布时间】:2013-05-03 03:54:07
【问题描述】:

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

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

为我的愚蠢深表歉意

【问题讨论】:

标签: java list arraylist indexoutofboundsexception


【解决方案1】:

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

public ArrayList(int initialCapacity)

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

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

来自ArrayList 本身的文档:

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

容量不是大小。

所以,一些选择:

  • 用空条目填充列表,直到您获得所需的大小
  • 使用数组而不是列表(毕竟,您只需要它是固定大小的,对吧?)
  • 改用Map&lt;Integer, Key&gt;

【讨论】:

  • 谢谢。我不能使用数组,因为我需要通过重新映射键来做一些事情,我想我会用空值填充它
  • 呃...答案末尾的“选项”部分呢?
  • @BenjaminTilbury:“需要做一些事情”是什么意思?如果您有其他获取列表的方法,您可以随时使用Arrays.asList
  • @skuntsel,当我这么说的时候,它并不存在:L
  • @JonSkeet 还有一些我稍后会添加的方法,使用列表比将数组变成列表要容易得多
【解决方案2】:

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

您可能希望将映射代码映射到键,是吗?为此有一个Map&lt;K, V&gt;

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

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

如果您需要通过代码获取密钥,您可以从Map 获取,如下所示:

keyMap.get(keyCode);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2023-04-02
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多