为什么我会在同步锁上得到NullPointerException?

时间:2012-08-30 02:11:15

标签: java multithreading thread-safety

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

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放在哪里,问题都会存在。我有两个线程运行到UpdateDraw都有screenLock

导致NullPointerException锁定的原因是什么?

跟踪:

  

java.lang.NullPointerException at   com.dnx.manavo.ScreenManager.Update(ScreenManager.java:107)at   com.dnx.manavo.ApplicationActivity.Update(ApplicationActivity.java:98)   在com.dnx.manavo.GameThread.run(GameThread.java:43)

2 个答案:

答案 0 :(得分:4)

感谢@Adam Batkin和@MadProgrammer - 我在NullPointerException的某些部分找到了我的具体screenManager

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

其他理由:

  • screenLock为空
  • 同步块内的代码抛出异常

答案 1 :(得分:0)

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

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

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

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