2012-01-28 7 views
0

この問題は一見どこからも出現していないようで、過去2時間半は私を狂ってしまっています。私は解決策を探してインターネットの周りにいましたが、私の探求は無駄でした。Android - 「キャッチされていない例外(グループ= 0x40015560)で終了するスレッド」

したがって、私は助けを求めることにしました。

私のAndroidゲームはうまくコンパイルされていましたが、正常に動作するために使用されましたが、今は動作しません。 それはゲームの中で使用するためにいくつかの画像を追加し始めた頃に発生しました。

ログに記録されたメッセージ:

01-28 20:42:34.510: WARN/dalvikvm(3857): threadid=10: thread exiting with uncaught exception (group=0x40015560) 
01-28 20:42:34.510: ERROR/AndroidRuntime(3857): FATAL EXCEPTION: Thread-11 
01-28 20:42:34.510: ERROR/AndroidRuntime(3857): java.lang.NullPointerException 
01-28 20:42:34.510: ERROR/AndroidRuntime(3857):  at com.ballbounce.bounce.MainGamePanel.update(MainGamePanel.java:153) 
01-28 20:42:34.510: ERROR/AndroidRuntime(3857):  at com.ballbounce.bounce.MainThread.run(MainThread.java:91) 
01-28 20:42:34.510: WARN/ActivityManager(105): Force finishing activity com.ballbounce.bounce/.BallBounceActivity 

私はNullPointerExceptionがしかし、実際の原因スレッド閉鎖の、出スレッドの結果として起こると思います。

Eclipseでプロジェクトを「クリーンアップ」して、Eclipseを再起動して、電話を再起動しました。すべての通常のものです。私の「元に戻す」機能は、ゲームを安定した状態にするのに十分遠くに戻らせることはできません。

関連するコード(私はできるだけダウン、それをできるだけ多くトリミングしようとしました):

BallBounceActivity.java

public class BallBounceActivity extends Activity { 
    // Trimmed down for ease-of-viewing 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     sensor = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0); 

     mainGamePanel = new MainGamePanel(this); 


     setContentView(mainGamePanel); 

     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "BallBounceActivity"); 
    } 

    protected void onPause() { 
     // Trimmed down for ease-of-viewing 
    } 

    protected void onResume() { 
     // Trimmed down for ease-of-viewing 
    } 

    protected void onStop() { 
     // Trimmed down for ease-of-viewing 
    } 

    private SensorEventListener accelerationListener = new SensorEventListener() { 
     public void onAccuracyChanged(Sensor sensor, int acc) { 
     } 

     @Override 
     public void onSensorChanged(SensorEvent event) { 
      // Trimmed down for ease-of-viewing 
     } 

    }; 
} 

MainGamePanel.java

public class MainGamePanel extends SurfaceView implements SurfaceHolder.Callback { 
    // Trimmed down for ease-of-viewing 

    private MainThread thread; 

    // The Fps to be displayed 
    private String avgFps; 
    public void setAvgFps(String avgFps) { 
     this.avgFps = avgFps; 
    } 

    public MainGamePanel(Context context) { 
     super(context); 

     getHolder().addCallback(this); 

     setFocusable(true); 

    } 

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

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     thread = new MainThread(getHolder(), this); 

     thread.setRunning(true); 
     thread.start(); 

     random = new Random(); 

     bmpFactoryOptions = new BitmapFactory.Options(); 
     bmpFactoryOptions.inScaled = false; 

     powerups = new Bitmap[12]; 

     // Copy and paste time! 
     powerups[0] = BitmapFactory.decodeResource(getResources(), R.drawable.coin, bmpFactoryOptions); 
     powerups[1] = BitmapFactory.decodeResource(getResources(), R.drawable.powerup_8, bmpFactoryOptions); 
     powerups[2] = BitmapFactory.decodeResource(getResources(), R.drawable.powerup_9, bmpFactoryOptions); 
     // Trimmed down for ease-of-viewing 


     ballImages = new Bitmap[8]; 

     // Copy and paste time! 

     ballImages[0] = BitmapFactory.decodeResource(getResources(), R.drawable.ball_0, bmpFactoryOptions); 
     ballImages[1] = BitmapFactory.decodeResource(getResources(), R.drawable.ball_1, bmpFactoryOptions); 
     ballImages[2] = BitmapFactory.decodeResource(getResources(), R.drawable.ball_2, bmpFactoryOptions); 
     // Trimmed down for ease-of-viewing 

     items = new ArrayList<Item>(); 

     theBall = new Ball(this.getWidth(), this.getHeight(), 24.0f, items, ballImages); 
     platform = new Platform(this.getWidth(), this.getHeight(), 180.0f); 
     player = new Player(theBall, platform); 

     theBall.setPlayer(player); 
     theBall.setPlatform(platform); 

     x = y = 0.0f; 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Trimmed down for ease-of-viewing 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     // Trimmed down for ease-of-viewing 
    } 
    public void render(Canvas canvas) { 
     // Trimmed down for ease-of-viewing 
    } 

    public void update() { 
     // Trimmed down for ease-of-viewing 

     theBall.update(x, y); 
     platform.update(); 
    } 

    public void updateAccelerometerValues(float x, float y, float z) { 
     // Trimmed down for ease-of-viewing 
    } 

    public void displayScore(Canvas canvas) { 
     // Trimmed down for ease-of-viewing 
    } 

    public void displayFps(Canvas canvas, String fps) { 
     // Trimmed down for ease-of-viewing 
    } 

} 

MainThread.java

public class MainThread extends Thread { 
    // Trimmed down for ease-of-viewing 

    public MainThread(SurfaceHolder surfaceHolder, MainGamePanel gamePanel) { 
     super(); 
     this.surfaceHolder = surfaceHolder; 
     this.gamePanel = gamePanel; 
    } 

    @Override 
    public void run() { 
     Canvas canvas; 
     // Trimmed down for ease-of-viewing 

     sleepTime = 0; 

     while (running) { 
      canvas = null; 

      try { 
       canvas = this.surfaceHolder.lockCanvas(); 
       synchronized (surfaceHolder) { 
        beginTime = System.currentTimeMillis(); 
        framesSkipped = 0; 

        this.gamePanel.update(); 

        this.gamePanel.render(canvas);    

        timeDiff = System.currentTimeMillis() - beginTime; 

        sleepTime = (int)(FRAME_PERIOD - timeDiff); 

        if (sleepTime > 0) { 
         try { 
          Thread.sleep(sleepTime);  
         } catch (InterruptedException e) {} 
        } 

        while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) { 
         this.gamePanel.update(); 
         sleepTime += FRAME_PERIOD; 
         framesSkipped++; 
        } 

        // Trimmed down for ease-of-viewing 
       } 
      } finally { 
       if (canvas != null) { 
        surfaceHolder.unlockCanvasAndPost(canvas); 
       } 
     } 
     Log.d(TAG, "Thread exited"); 
    } 
} 

R.java

public final class R { 
    public static final class attr { 
    } 
    public static final class drawable { 
     public static final int ball_0=0x7f020000; 
     public static final int ball_1=0x7f020001; 
     public static final int ball_2=0x7f020002; 
     public static final int ball_3=0x7f020003; 
     public static final int ball_4=0x7f020004; 
     public static final int ball_5=0x7f020005; 
     public static final int ball_6=0x7f020006; 
     public static final int ball_7=0x7f020007; 
     public static final int coin=0x7f020008; 
     public static final int ic_launcher=0x7f020009; 
     public static final int powerup_8=0x7f02000a; 
     public static final int powerup_9=0x7f02000b; 
     public static final int powerup_9_save=0x7f02000c; 
    } 
    public static final class layout { 
     public static final int main=0x7f030000; 
    } 
    public static final class string { 
     public static final int app_name=0x7f040001; 
     public static final int hello=0x7f040000; 
    } 
} 

この問題を解決する方法のように任意のアイデア、またはこれが起こったのかについてなども、任意の提案は、いただければ幸いです。

事前に感謝します。

+0

@ WillManson ...あなたが問題を解決したら、他の人にとって理解しやすくなるので、答えブロックを入れてみてください。そのような有用な情報を共有してくれてありがとう。 – swiftBoy

+0

@RDC私はあなたが提案した通りに行った。ありがとう! –

+0

は本当にいい音です:) – swiftBoy

答えて

1

私は解決策を思い付いた:

全体surfaceCreated(SurfaceHolder holder)関数が完了する前にgamePanel.update()関数はスレッド11によって呼び出されました。これは、スレッド11が初期化される前にオブジェクトを使用しようとしていたことを意味し、もちろんNullPointerExceptionが発生しました。

while(gamePanel.player == null) { 
    try { 
     Thread.sleep(10); 
    } 
    catch (InterruptedException e) {} 
} 

だけMainThreadのrun()機能でwhile (running) ...ビットの前に:

私の修正が追加することでした。 ( 'プレーヤー'の選択は、 'プレーヤー'が初期化される最後のオブジェクトであるためです)。

非常に興味深い問題と興味深い解決策です。

私は、このソリューションが将来的にいくつかの人々にとって問題を解決することを願っています!

+0

これは物事を同期する非常に奇妙な方法です。ロックを使用する必要があります。 – Vaiden

関連する問題