6

我只有一个“简单”的同步锁块:

private final Object screenLock = new Object();

public void Update(double deltaTime)
{
    synchronized (screenLock)
    {
        screenManager.Update(deltaTime);
    }
}

public void Draw()
{
    synchronized (screenLock)
    {
        screenManager.Draw();
    }
}

deltaTime不是nullscreenManager不是null,所以我有点失落。

我知道我不应该把锁放在这么高的级别上,但是无论我把 Block 放在哪里,问题都仍然存在。我有两个线程运行到Update并且Draw都使用screenLock.

什么会导致NullPointerException上锁?

痕迹:

java.lang.NullPointerException at com.dnx.manavo.ScreenManager.Update(ScreenManager.java:107) at com.dnx.manavo.ApplicationActivity.Update(ApplicationActivity.java:98) at com.dnx.manavo.GameThread.run(游戏线程.java:43)

4

2 回答 2

4

感谢@Adam Batkin 和@MadProgrammer - 我NullPointerExceptionscreenManager

我做了一些研究,有时NullPointerException会在同步块开始时抛出一个,但实际上它是在块内抛出的。

其他原因:

  • screenLock一片空白
  • 同步块内的代码抛出异常
于 2012-08-30T02:58:22.527 回答
0

对 NPE 唯一可能的synchronized (screenLock)解释screenlocknull.

检查您正在查看的源代码是否与您实际运行的代码相匹配。

另一种可能性是在其他地方抛出异常。堆栈跟踪应该告诉您异常是在哪里引发的(模数愚蠢......)。

如果这没有帮助,请创建一个演示问题的 SSCE 并将其添加到问题中。

于 2012-08-30T02:16:43.397 回答