2013-04-04 19 views
0

目前我正在開發一些網站的應用程序,但我有點瘋狂開發遊戲應用程序,所以通過下面的教程在第一畫布上創建一個圖像級別,並在下一級圖像不得不爲此移動也給予編碼,但是當我運行該應用程序時,它會強制關閉。 這是我的代碼。空指針異常錯誤,同時運行遊戲應用程序

public class GameView extends SurfaceView { 

private Bitmap bmp; 
private SurfaceHolder holder; 
private GameLoopThread gameLoopThread; 
private int x = 0; 

public GameView(Context context) { 
    super(context); 
gameLoopThread = new GameLoopThread() 
    holder = getHolder(); 
    holder.addCallback(new SurfaceHolder.Callback() { 

      @Override 
      public void surfaceDestroyed(SurfaceHolder holder) { 
       boolean retry = true; 
       gameLoopThread.setRunning(false); 
       while (retry) { 
         try { 
          gameLoopThread.join(); 
          retry = false; 
         } catch (InterruptedException e) { 
         } 
       } 
      } 

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


      @Override 
      public void surfaceChanged(SurfaceHolder holder, int format, 
         int width, int height) { 
      } 

    }); 

    bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
} 
@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.BLACK); 
    if (x < getWidth() - bmp.getWidth()) { 
     x++; 
} 
    canvas.drawBitmap(bmp, x, 10, null); 
} 

Thread類

public class GameLoopThread extends Thread{ 
private GameView view; 
private boolean running = false; 

public GameLoopThread(GameView view) { 
     this.view = view; 
} 


public void setRunning(boolean run) { 
     running = run; 
} 



@SuppressLint("WrongCall") 
@Override 

public void run() { 
     while (running) { 
      Canvas c = null; 
      try { 
        c = view.getHolder().lockCanvas(); 
        synchronized (view.getHolder()) { 
          view.onDraw(c); 
        } 

      } finally { 
        if (c != null) { 
          view.getHolder().unlockCanvasAndPost(c); 
        } 
      } 
     } 
} 

logcat的結果

03-21 23:38:26.341: E/AndroidRuntime(754): FATAL EXCEPTION: main 
03-21 23:38:26.341: E/AndroidRuntime(754): java.lang.NullPointerException 
03-21 23:38:26.341: E/AndroidRuntime(754): at com.killthemall.GameView$1.surfaceCreated(GameView.java:40) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.view.SurfaceView.updateWindow(SurfaceView.java:543) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.view.SurfaceView.dispatchDraw(SurfaceView.java:348) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.view.View.draw(View.java:6883) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.widget.FrameLayout.draw(FrameLayout.java:357) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.view.View.draw(View.java:6883) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.widget.FrameLayout.draw(FrameLayout.java:357) 
03-21 23:38:26.341: E/AndroidRuntime(754): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.view.ViewRoot.draw(ViewRoot.java:1522) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.view.ViewRoot.performTraversals(ViewRoot.java:1258) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-21 23:38:26.341: E/AndroidRuntime(754): at android.os.Looper.loop(Looper.java:123) 
03-21 23:38:26.341: E/AndroidRuntime(754):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-21 23:38:26.341: E/AndroidRuntime(754): at java.lang.reflect.Method.invokeNative(Native Method) 
03-21 23:38:26.341: E/AndroidRuntime(754): at java.lang.reflect.Method.invoke(Method.java:507) 
03-21 23:38:26.341: E/AndroidRuntime(754):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-21 23:38:26.341: E/AndroidRuntime(754):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-21 23:38:26.341: E/AndroidRuntime(754): at dalvik.system.NativeStart.main(Native Method) 

回答

2

com.killthemall.GameView $ 1.surfaceCreated(GameView.java:40)

這告訴你是一個空指針發生在第40行的surfaceCreated方法中。看一下這種方法,第一行確實是gameLoopThread.setRunning,所以這可能會失敗並出現空指針exception if gameLoopThread爲空。

查看代碼,您並未初始化gameLoopThread,因此它的默認值爲null。在GameView的構造函數中,添加行gameLoopThread = new GameLoopThread()

+0

我hv粘貼了這段代碼gameLoopThread =新的GameLoopThread()在Gameview構造函數中,但仍然獲得強制關閉@Jeff Foster – 2013-04-04 09:37:17

+0

@DD。請在您更改內容時更新您的代碼... – WarrenFaith 2013-04-04 10:03:33

+0

已更新@WarrenFaith – 2013-04-04 11:56:55