NullPointerException из "синхронизированного" - PullRequest
0 голосов
/ 13 апреля 2011

Я получаю NullPointerException от synchronized метода в коде ниже. mElements - это массив списков врагов, который выглядит следующим образом:

public ArrayList<Enemies> mElements = new ArrayList<Enemies>(); 

Странная часть заключается в том, что я без проблем выполняю еще один синхронизированный ранее код в том же массиве. Когда я отлаживаю программу, я вижу, что arrayList не равен NULL, в него добавлен один элемент. Я больше не могу следить за отладкой, так как синхронизирован не мой код. Я надеюсь, что я могу получить подсказку от кого-то здесь. Пожалуйста, попросите более подробную информацию, если это необходимо.

public void animate(long elapsedTime) {
    synchronized (mElements) {
        for (Enemies enemies : mElements) {
            enemies.animate(elapsedTime);
        }
}

Вот некоторые из следов стека:

04-15 17:31:26.897: INFO/ActivityManager(60): Displayed activity twod.game/.twod.StartGame: 15025 ms (total 15025 ms)
04-15 17:31:32.112: WARN/dalvikvm(386): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
04-15 17:31:32.177: ERROR/AndroidRuntime(386): FATAL EXCEPTION: Thread-9
04-15 17:31:32.177: ERROR/AndroidRuntime(386): java.lang.NullPointerException
04-15 17:31:32.177: ERROR/AndroidRuntime(386):     at twod.game.twod.Panel.animate(Panel.java:81)
04-15 17:31:32.177: ERROR/AndroidRuntime(386):     at twod.game.twod.ViewThread.run(ViewThread.java:31)
04-15 17:31:32.203: WARN/ActivityManager(60):   Force finishing activity twod.game/.twod.StartGame
04-15 17:31:32.417: DEBUG/dalvikvm(60): GC_FOR_MALLOC freed 7573 objects / 446304 bytes in 104ms
04-15 17:31:42.267: WARN/ActivityManager(60): Launch timeout has expired, giving up wake lock!
04-15 17:31:42.267: WARN/ActivityManager(60): Activity idle timeout for HistoryRecord{440028c8 twod.game/.twod.game}
04-15 17:31:52.287: WARN/ActivityManager(60): Activity destroy timeout for HistoryRecord{4403f608 twod.game/.twod.StartGame}

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

Я бы сказал, что это не проблема синхронизации, скорее, у вас могут быть нулевые элементы внутри вашего ArrayList (ArrayList разрешает нулевые элементы). Попробуйте распечатывать врагов каждый раз, прежде чем что-либо делать с ним.

Нулевые элементы не будут пропущены при итерации ArrayList. Вот простой пример, демонстрирующий это в действии:

import java.util.ArrayList;
import java.util.List;

public class NullTest {
  public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    list.add("foo");
    list.add(null);
    list.add("bar");

    System.out.println("Begin");
    for (String val : list) {
      System.out.println("Value: " + val);
      try {
        // Try to use the value
        val.toString();
        System.out.println("No NPE");
      } catch (NullPointerException npe) {
        System.out.println("NPE Caught");
      }
    }
    System.out.println("End");
  }
}
1 голос
/ 13 апреля 2011

Попробуйте использовать CopyOnWriteArrayList вместо ArrayList

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...