java - 来自 "synchronized"的 NullPointerException

标签 java android nullpointerexception

我确实从下面的codesnip中的synchronized方法中得到了一个NullPointerExceptionmElements 是一个敌人数组列表,如下所示:

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

奇怪的是,我在同一个 arrayList 上的代码中之前进行了另一个同步,没有出现问题。当我调试程序时,我可以看到 arrayList 不为空,它有一个元素添加到其中。我无法再跟踪调试,因为同步不是我的代码。我希望我能从这里的某人那里得到提示。如果需要,请询问更多详细信息。

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}

最佳答案

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

迭代 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");
  }
}

关于java - 来自 "synchronized"的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5652612/

相关文章:

java - Lombok v1.18.12 不适用于 Eclipse JEE 2019-12 版本

android - Unwind_Backtrace 中的堆栈跟踪与映射文件地址不匹配

android - 在 AlertDialog.Builder 中使用 findViewById() 时出现 NullPointerException

java - 使用 Android Google Maps API 设置 MapType 空指针异常

java - 如何使用 JSON 序列化/反序列化 Option<> 类(函数式 java)?

javascript - 如何提供解耦的 React 前端?

java - Maven 初学者问题 - 虽然项目设置有些复杂

java - 空对象引用工具栏android

android - FCM token 是否在应用程序更新时刷新?

java - 在方法中调用私有(private)最终变量时出现 NullPointerException