Java 为什么在同步锁上会出现NullPointerException?
我只有一个“简单”的同步锁块:Java 为什么在同步锁上会出现NullPointerException?,java,multithreading,thread-safety,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) {
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
,所以我有点迷路了
我知道我不应该在这么高的级别上设置锁,但无论我在哪里设置块,问题都会持续存在。我有两个线程运行到Update
和Draw
,这两个线程都使用screenLock
什么会导致锁上出现NullPointerException
跟踪:
位于的java.lang.NullPointerException
com.dnx.manavo.ScreenManager.Update(ScreenManager.java:107)位于
com.dnx.manavo.ApplicationActivity.Update(ApplicationActivity.java:98)
在com.dnx.manavo.gameshread.run(gameshread.java:43)
关于
synchronized(screenLock)
上NPE的唯一可能解释是screenLock
为null
检查您正在查看的源代码是否与实际运行的代码匹配
另一种可能性是异常被抛出到其他地方。stacktrace应该告诉您异常抛出的位置(模愚蠢…)
如果这没有帮助,创建一个SSCE来演示问题并将其添加到问题中。多亏了@Adam Batkin和@MadProgrammer-我在
屏幕管理器的某些部分找到了我的特定NullPointerException
我做了一些研究,有时会在同步块的开头抛出一个NullPointerException
,但实际上它是在块内抛出的
其他原因:
屏幕锁
为空
- 同步块中的代码正在引发异常
NullPointerException的完整堆栈跟踪是什么?你能提供一个完整的工作示例来演示NPE吗?@AdamBatkindeltaTime
是一个原语,它不能null
。哦,这很公平。是的,没有把示例代码读清楚。我的意思是,你怎么知道screenManager
不是空的?这将导致此处出现NPE我可能在此处找到了错误的树(那里没有新的;),但是NullPointerException
来自ScreenManager.Update
而不是ApplicationActivity.Update
方法。从您的代码示例来看,这表明您已经通过了synchronized
块,进入了screenManager.Update
方法???@MadProgrammer——糟糕的举动!!人们永远不应该实际读取异常回溯。问这样的问题要好得多。@dnxviral——简短而完整的例子。你的研究没有意义。在本例中,stacktrace清楚地显示异常正在ScreenManager.Update()
而不是ApplicationActivity.Update()
中抛出。仔细阅读stacktrace总是值得的。。。为了避免在调试过程中突然得出错误的结论。它不是在com.dnx.manavo.GameThread.run(GameThread.java:43)
中,而是在屏幕管理器中当前屏幕中。我确实研究了这两个点,但找不到它被抛出这些点的原因,因为线程在实例化当前屏幕后正在更改值。这是个奇怪的案子。