Java 在最终块完成后引发的NullPointerException
我正在尝试制作一个Android游戏,我正在遵循一些代码示例以使我的游戏循环正常工作。它包括制作一条新的线。在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
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();
}