Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在同步锁上会出现NullPointerException?_Java_Multithreading_Thread Safety - Fatal编程技术网

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吗?@AdamBatkin
deltaTime
是一个原语,它不能
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)
中,而是在
屏幕管理器中
当前屏幕中。我确实研究了这两个点,但找不到它被抛出这些点的原因,因为线程在实例化
当前屏幕后正在更改值。这是个奇怪的案子。