2012-08-30 95 views
4

我有隻是一個「簡單」同步鎖塊作爲這樣的:爲什麼我會在Synchronized Lock上得到NullPointerException?

private final Object screenLock = new Object(); 

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

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

deltaTimenullscreenManagernull,所以我有點失落。

我知道我不應該對這樣的高級別進行鎖定,但是無論我在哪裏放置塊,問題都會持續存在。我有兩個線程運行到UpdateDraw都與screenLock

什麼會導致鎖上的NullPointerException

跟蹤:

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

+1

有什麼'NullPointerException'的完整堆棧跟蹤?你能否提供一個演示NPE的完整實例? – Jeffrey

+0

你怎麼知道'deltaTime'和'screenManager'不是null? –

+1

@AdamBatkin'deltaTime'是一個基元,它不能是'null'。 – Jeffrey

回答

4

感謝@Adam Batkin,並@MadProgrammer - 我發現我的具體NullPointerExceptionscreenManager

一些地區內我做了一些研究,有時一個NullPointerException將在synchronized塊的開頭被拋出,但在事實上它被扔進座內。

其他原因:

  • screenLock是您的synchronized塊內空
  • 守則拋出異常
+0

你的研究是沒有意義的。在這種情況下,stacktrace清楚地表明,異常是在'ScreenManager.Update()'而不是'ApplicationActivity.Update()'中拋出的。仔細閱讀stacktrace *總是會付出代價* ...以避免在調試過程中跳到不正確的結論。 –

+0

它不在'com.dnx.manavo.GameThread.run(GameThread.java:43)'它在'ScreenManager''當前屏幕內'。我確實研究了這兩種方法,但是找不到它在這些點上拋出的原因,因爲一個線程在實例化了「當前屏幕」後正在改變這些值。這是一個奇怪的例子。 –

0

synchronized (screenLock)一個NPE的唯一可能的解釋是screenlocknull

檢查您正在查看的源代碼是否與您實際運行的代碼相匹配。

另一種可能性是異常被引發到其他地方。堆棧跟蹤應該告訴你拋出異常的地方(模糊愚蠢......)。

如果這沒有幫助,請創建一個演示問題並將其添加到問題的SSCE。

+0

什麼是SSCE? –

+0

@dnxviral - 簡短,獨立的示例。 –

+0

@HotLicks噢,好的,謝謝 –

相關問題