6

私は「単純な」同期ロックブロックを持っています:

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ので、少し迷っています。

そのような高レベルにロックを設定するべきではないことはわかっていますが、ブロックを配置した場所で問題が解決しません。私は2つのスレッドを実行して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.GameThread.run( GameThread.java:43)

4

2 に答える 2

4

@Adam Batkin と @MadProgrammer のおかげNullPointerExceptionで、screenManager

私はいくつかの調査を行いNullPointerException、同期ブロックの開始時に a がスローされることがありますが、実際にはブロック内でスローされます。

その他の理由:

  • screenLock無効です
  • Synchronized Block 内のコードが例外をスローしています
于 2012-08-30T02:58:22.527 に答える
0

NPE の唯一の可能な説明は、synchronized (screenLock)それscreenlockですnull

見ているソースコードが実際に実行しているコードと一致することを確認してください。

もう 1 つの可能性は、例外が別の場所でスローされることです。スタックトレースは、例外がスローされた場所を通知する必要があります (モジュロ愚かさ ...)。

これで問題が解決しない場合は、問題を示す SSCE を作成し、質問に追加してください。

于 2012-08-30T02:16:43.397 に答える