首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自"synchronized“的NullPointerException

来自"synchronized“的NullPointerException
EN

Stack Overflow用户
提问于 2011-04-14 00:37:45
回答 2查看 1.5K关注 0票数 0

在下面的代码片段中,我确实从synchronized方法获得了一个NullPointerExceptionmElements是一个敌人的arrayList,看起来像这样:

代码语言:javascript
复制
public ArrayList<Enemies> mElements = new ArrayList<Enemies>(); 

奇怪的是,我在同一个arrayList上执行了另一个在代码中同步的操作,没有任何问题。当我调试程序时,我可以看到arrayList不是null,它有一个添加到其中的元素。我不能再继续调试了,因为synchronized不是我的代码。我希望我能从这里的人那里得到一些提示。如果需要,请询问更多详细信息。

代码语言:javascript
复制
public void animate(long elapsedTime) {
    synchronized (mElements) {
        for (Enemies enemies : mElements) {
            enemies.animate(elapsedTime);
        }
}

下面是一些堆栈跟踪:

代码语言:javascript
复制
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}
EN

回答 2

Stack Overflow用户

发布于 2011-04-14 00:45:38

我想说这不是一个同步问题,而是你的ArrayList中可能有空元素(ArrayList允许空元素)。在你做任何事情之前,试着把敌人打印出来。

当您迭代ArrayList时,不会跳过空元素。下面是一个简单的例子来说明这一点:

代码语言:javascript
复制
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");
  }
}
票数 3
EN

Stack Overflow用户

发布于 2011-04-14 01:40:18

尝试使用CopyOnWriteArrayList而不是ArrayList

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5652612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档