我正在为Android平台制作一个简单的2D游戏,它在2.0及以上版本中运行良好,但在1.6设备上进行测试时,它会立即崩溃。在运行调试器时,我似乎在线程类中得到一个空指针异常。我只是想知道是否有人对问题的位置有任何想法。
这是线程类的代码:
package com.marcusortiz.burnination;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
public class GameThread extends Thread
{
private SurfaceHolder sHolder;
private MainView panel;
private boolean isRunning;
public GameThread(SurfaceHolder sHolder, MainView panel)
{
this.sHolder = sHolder;
this.panel = panel;
}
public void setRunning(boolean isRunning)
{
this.isRunning = isRunning;
}
public SurfaceHolder getSurfaceHolder()
{
return sHolder;
}
@Override
public void run()
{
Canvas canvas;
while(isRunning)
{
canvas = null;
try
{
canvas = sHolder.lockCanvas(null);
synchronized(sHolder)
{
for(Sprite s : panel.getSprites())
{
s.update();
}
panel.onDraw(canvas);
}
}
finally
{
if(canvas != null)
{
sHolder.unlockCanvasAndPost(canvas);
}
}
}
}
}
也许这个代码存在一些我不知道的兼容性问题 - 在使用线程时我是一个初学者。
编辑:这是请求的堆栈跟踪
burnination [Android Application]
DalvikVM[localhost:8608]
Thread [<3> main] (Running)
Thread [<15> Binder Thread #3] (Running)
Thread [<13> Binder Thread #2] (Running)
Thread [<11> Binder Thread #1] (Running)
Thread [<17> Thread-9] (Suspended (exception NullPointerException))
GameThread.run() line: 53
答案 0 :(得分:1)
这不是堆栈跟踪,但看起来问题出现在第53行,这正是我试图得到的。看起来你发布的代码可能并不完全与你正在运行的代码完全相同,因为第53行是一个右大括号。该行上可能存在一个变量为null的变量。
答案 1 :(得分:0)
我给你一些建议。 1.找出崩溃所在的哪条线。 2.检查SDK(1.6和2.0)源代码中API的不同之处。 如果您可以使用Android 2.0,那么我认为您的代码不存在问题。
答案 2 :(得分:0)
默认情况下,大多数调试器(包括Eclipse)仅在“未捕获”异常时中断。它们不会破坏“捕获”异常,即任何“捕获”块适用的异常。你的“finally”块在这里充当了一个包罗万象,因为它包含了即使抛出异常也必须执行的代码。
当“try”块中的函数抛出NullPointerException时,调试器不会停止,因为它是您可能试图忽略的“捕获”异常。执行“finally”块中的代码,然后重新抛出异常。这次没有人能抓住它,所以Eclipse停了下来。你只是指着“终结”区块的右大括号,因为那是重新投掷的地方。
如果为捕获+未捕获的NullPointerException配置调试断点,您将在抛出点看到失败。另外,如果你让它继续并让线程死掉,你应该看到Android默认的未捕获异常处理程序的logcat输出,指示了抛出点。