Android:使用Thread调用函数时的NullPointerExceptions

时间:2014-06-13 02:14:47

标签: android

我遇到了这个问题。 我用画布绘制角色。

@Override
public void onDraw(Canvas canvas) {
    this.mcanvas = canvas;
    mcanvas.drawBitmap(mBg, null, mRect, mPaint);

    for (int i = temps.size() - 1; i >= 0; i--) {
        temps.get(i).onDraw(mcanvas);
    }
    for (Sprite sprite : sprites) {
        sprite.onDraw(canvas);
    }
    while(timeleft>0) { 
        timeleft=(int) (timeleft-1);    
        score.onDraw(canvas,timeleft); break; 
    }
}

当我为此函数设置drawBitmap并且Thread类运行时。

@Override
public void run() {
    long ticksPS = 1000 / FPS;
    long startTime;
    long sleepTime;
    while (running) {
        Canvas c = null;
        startTime = System.currentTimeMillis();
        try {
            c = view.getHolder().lockCanvas();
            synchronized (view.getHolder()) {
                view.onDraw(c);
            }

        } finally {
            if (c != null) {
                view.getHolder().unlockCanvasAndPost(c);
            }
        }
        sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
        try {
            if (sleepTime > 0)
                sleep(sleepTime);
            else
                sleep(2);
        } catch (Exception e) {
        }

    }

}

但是当我重播游戏时,logcat显示错误并关闭应用程序。

06-13 02:04:12.347: E/AndroidRuntime(956): FATAL EXCEPTION: Thread-94
06-13 02:04:12.347: E/AndroidRuntime(956): java.lang.NullPointerException
06-13 02:04:12.347: E/AndroidRuntime(956):  at com.example.Boss.GameView.onDraw(GameView.java:353)
06-13 02:04:12.347: E/AndroidRuntime(956):  at com.example.Boss.GameLoopThread.run(GameLoopThread.java:30)

它显示错误:

mcanvas.drawBitmap(mBg, null, mRect, mPaint);

view.onDraw(c);

我不知道发生了什么事。我需要帮助。提前谢谢!。

2 个答案:

答案 0 :(得分:0)

 for (Sprite sprite : sprites) {
    sprite.onDraw(canvas);
    }

尝试使用for-loop代替,我曾经在游戏中运行foreach循环2次或更多次时崩溃,还发布了更多细节:

 for(int i =0; i< sprites.size(); i++){
      Sprite s = sprites.get(i);
      s.onDraw(canvas);
   }

答案 1 :(得分:0)

错误似乎是mcanvasnulllockCanvas()返回null时可能会发生这种情况。请查看SurfcaeHolder.lockCanvas()的文档说明:

  

如果尚未创建曲面或无法编辑曲面,则返回null。您通常需要实现Callback.surfaceCreated以找出Surface可供使用的时间。