【问题标题】:IndexOutOfBoundsException when removing ArrayList element删除 ArrayList 元素时出现 IndexOutOfBoundsException
【发布时间】:2013-05-14 17:11:42
【问题描述】:

我在这里有这段代码(使用 lwjgl,但应该没有实际意义)尝试在按下 esc 键时暂停游戏。我使用带有键的 ArrayList 来跟踪按下的内容和未按下的内容。

public List<Integer> keys = new ArrayList<Integer>();

public void get() {
    if (isKeyDown(KEY_ESCAPE) && !keys.contains(KEY_ESCAPE)) {
        keys.add(KEY_ESCAPE);
        keyEscape();
    }
}

public void rem() {
    if (!isKeyDown(KEY_ESCAPE) && keys.contains(KEY_ESCAPE))
        keys.remove(KEY_ESCAPE);
}

private void keyEscape() {
    Screen.paused ^= true;
}

这是由循环调用的,它在循环中一个接一个地执行get() 和rem(),按此顺序。当我松开 ESC 时,这给了我一个很棒的 java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 keys.remove(KEY_ESCAPE);。

有人有什么见解可以分享吗?

【问题讨论】:

  • 为什么不使用boolean 标志而不必每次都检查ArrayList?似乎不必要地昂贵。
  • 考虑使用 enum 代替 Integer 值作为键值

标签: java exception arraylist


【解决方案1】:

KEY_ESCAPE 的值是多少?

它可能是值为 1 的 int,所以不是删除具有该值的对象,而是删除位置 1 处显然不存在的对象。

【讨论】:

  • 啊,你是对的。我使用keys.remove(Integer.valueOf(KEY_ESCAPE)); 修复了它。谢谢!
【解决方案2】:

ArrayList.remove 为要删除元素的 index 接受一个 int 参数。在您的情况下, KEY_ESCAPE 也恰好是一个整数。

简而言之,您尝试删除转义键的整数值作为 ArrayList 的 index!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-28
    • 2014-06-03
    • 2019-03-30
    • 2012-04-29
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多