0

我创建了一个小安卓游戏,但出现了奇怪的错误。

这是日志:

    12-31 16:10:22.407: E/AndroidRuntime(12824): FATAL EXCEPTION: Thread-1461
    12-31 16:10:22.407: E/AndroidRuntime(12824): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
    12-31 16:10:22.407: E/AndroidRuntime(12824):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
    12-31 16:10:22.407: E/AndroidRuntime(12824):    at java.util.ArrayList.get(ArrayList.java:304)
    12-31 16:10:22.407: E/AndroidRuntime(12824):    at **.***.****.GameScreen.updatePaused(GameScreen.java:91)
    12-31 16:10:22.407: E/AndroidRuntime(12824):    at **.***.****.GameScreen.update(GameScreen.java:43)
    12-31 16:10:22.407: E/AndroidRuntime(12824):    at **.***.****.framework.impl.AndroidFastRenderView.run(AndroidFastRenderView.java:39)
    12-31 16:10:22.407: E/AndroidRuntime(12824):    at java.lang.Thread.run(Thread.java:856)

这是执行的部分代码:

    int len = touchEvents.size();
    for(int i = 0; i < len; i++) {
        TouchEvent event = touchEvents.get(i); ->>> this line
    .
    .
    .

怎么了 ?

4

3 回答 3

5

如果您遇到线程问题,则必须在像这样循环之前在集合上同步

synchronize(touchEvents) {
    for(TouchEvent event : touchEvents) {
        //do whatever you want with events
    }
}

或者,您可以制作集合的本地副本并循环,如果在您处理副本时处理集合中的事件仍然有效,如果它们已被删除。

于 2012-12-31T15:52:54.207 回答
2

最安全的方法肯定是像这样使用增强的 for 循环

for(TouchEvent event : touchEvents) {
    //do whatever you want with events
}
于 2012-12-31T15:34:02.810 回答
2

您应该始终检查 NULL。

int len = touchEvents != null ? touchEvents.size() : 0
for(int i = 0; i < len; i++)
  TouchEvent event = touchEvents.get(i);
于 2012-12-31T15:52:23.977 回答