0

小さな Android ゲームを作成しましたが、奇妙なエラーが発生します。

ログは次のとおりです。

    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 に答える