Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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_Android_Nullpointerexception_Try Finally - Fatal编程技术网

Java 在最终块完成后引发的NullPointerException

Java 在最终块完成后引发的NullPointerException,java,android,nullpointerexception,try-finally,Java,Android,Nullpointerexception,Try Finally,我正在尝试制作一个Android游戏,我正在遵循一些代码示例以使我的游戏循环正常工作。它包括制作一条新的线。在run()方法中,我有一个try/finally块。在finally块执行后,将抛出一个NullPointerException。我不知道为什么,似乎没有任何东西是空的,即使它是空的,也没有任何东西引用任何空的东西。我想这可能是空的,但似乎不是。以下是我认为相关的代码: public class MainThread extends Thread { private boolean ru

我正在尝试制作一个Android游戏,我正在遵循一些代码示例以使我的游戏循环正常工作。它包括制作一条新的线。在
run()
方法中,我有一个try/finally块。在finally块执行后,将抛出一个
NullPointerException
。我不知道为什么,似乎没有任何东西是空的,即使它是空的,也没有任何东西引用任何空的东西。我想这可能是空的,但似乎不是。以下是我认为相关的代码:

public class MainThread extends Thread {
private boolean running;
private final SurfaceHolder holder;

private boolean GameIsRunning = false;

private int mMode;
public static final int STATE_LOSE = 1;
public static final int STATE_PAUSE = 2;
public static final int STATE_READY = 3;
public static final int STATE_RUNNING = 4;
public static final int STATE_WIN = 5;

private MainGame game;

public MainThread(SurfaceHolder holder, MainGamePanel panel) {
    super();
    this.holder = holder;
    game = new MainGame(panel.getContext());
    mMode = STATE_RUNNING;
}

@Override
public void run() {
    while (running) {
        Canvas c = null;
        try {
            c = holder.lockCanvas(null);
            synchronized (holder) {
                if (mMode == STATE_RUNNING) {
                    updateAll();
                }
                drawAll(c);
            }
        } finally {
            // do this in a finally so that if an exception is thrown
            // during the above, we don't leave the Surface in an
            // inconsistent state
            if (c != null) {
                holder.unlockCanvasAndPost(c);
            }
        } // <<<<<<<<<<<<< After this line executes a null pointer exception is thrown
    } 
}

谢谢

NPE被抛出到try块中,并在finally块执行后可见

从代码的角度来看,这很可能是因为当您将
c
传递给
updateAll
时,
c
null
。在finally块中有一个
null
检查,所以我猜您希望它可能是null。在try块中添加另一个检查,并在那里处理
c==null


从android API(
SurfaceHolder#lockCanvas
):

如果曲面尚未创建或无法编辑,则返回null


尝试替换
c=holder.lockCanvas(null)带有
c=holder.lockCanvas()


当然,你应该发布stacktrace。

stacktrace会告诉你——这就是它的用途。至少把它贴在这里,这样我们就可以查看它了。
这个
永远不能是
空的
。这是不可能的。有道理,但是当null指针异常为空时,c不是nullthrown@robev-为NPE添加一个catch并打印或记录stacktrace,以找出谁在抛出NPE。我添加了一个检查,但仍然存在一个异常thrown@robev-如果
c
不为null,则在
updateAll()中抛出NPE
或在
drawAll(c)
中。我的主要问题是NPE来自哪里,现在我知道try块:)thanksStack跟踪没有用,这就是为什么我没有发布它:Thread[Thread-9](挂起(异常NullPointerException))MainThread.run()行:52@robev,stacktraces从来都不是无用的,你只需要知道如何阅读。即使是关闭了调试符号(没有行号)的stacktrace也会指示方法调用堆栈是什么,这会显著缩小可能的问题区域。
public class MainGamePanel extends SurfaceView implements SurfaceHolder.Callback{

private MainThread thread;

public MainGamePanel(Context context) {
    super(context);
    getHolder().addCallback(this);

    // create the game loop thread
    thread = new MainThread(getHolder(), this);
    setFocusable(true);
}


@Override
public void surfaceCreated(SurfaceHolder holder) {
    thread.setRunning(true);
    thread.start();
}