我只有一个“简单”同步锁定块:
private final Object screenLock = new Object();
public void Update(double deltaTime)
{
synchronized (screenLock)
{
screenManager.Update(deltaTime);
}
}
public void Draw()
{
synchronized (screenLock)
{
screenManager.Draw();
}
}
deltaTime
不是null
,screenManager
不是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) 在com.dnx.manavo.GameThread.run(GameThread.java:43)
答案 0 :(得分:4)
感谢@Adam Batkin和@MadProgrammer - 我在NullPointerException
的某些部分找到了我的具体screenManager
我做了一些研究,有时会在同步块开始时抛出NullPointerException
,但实际上它会被抛出Block。
其他理由:
screenLock
为空答案 1 :(得分:0)
synchronized (screenLock)
上对NPE的唯一可能解释是screenlock
为null
。
检查您正在查看的源代码是否与您实际运行的代码匹配。
另一种可能性是在其他地方抛出异常。堆栈跟踪应该告诉你抛出异常的位置(模数愚蠢......)。
如果这没有用,请创建一个演示问题的SSCE并将其添加到问题中。