NullPointerException выбрасывается после завершения блока finally - PullRequest
1 голос
/ 27 мая 2011

Я пытаюсь сделать игру для Android и следую нескольким примерам кода, чтобы заставить мой игровой цикл работать.Это включает в себя создание новой темы.В методе run() у меня есть блок try / finally.После выполнения блока finally выдается NullPointerException.Я понятия не имею, почему, ничто не кажется нулевым, и даже если это так, ничто не ссылается на ничто.Я подумал, что this было нулевым, но это не так.Вот код, который я считаю уместным:

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
    } 
}

Создание темы:

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();
}

Спасибо!

Ответы [ 2 ]

4 голосов
/ 27 мая 2011

NPE выбрасывается внутри блока try и становится видимым после того, как был выполнен блок finally.

При просмотре кода это происходит, скорее всего, потому что c равно null, когда вы передаете его updateAll. У вас есть null проверка внутри блока finally - так что, я думаю, вы ожидаете, что он может быть нулевым. Добавьте еще одну проверку в блок try и обработайте c == null там же.


Из API Android (SurfaceHolder#lockCanvas):

A null возвращается, если поверхность не была создана или иным образом не может быть отредактирована

0 голосов
/ 27 мая 2011

Попробуйте заменить c = holder.lockCanvas(null); на c = holder.lockCanvas();

И, конечно, вы должны опубликовать свою трассировку стека.

...