App stürzt ab... Wieso?

  • 6 Antworten
  • Letztes Antwortdatum
programm2008

programm2008

Ambitioniertes Mitglied
0
Hallo Leute,
ich hab ein kleines Spiel entwickelt und komme nicht weiter. Das Spiel wird mit Canvas gezeichnet. Also keinerlei Engines oder so. Wenn es zu einer Kollision mit einer anderen Figur kommt, beende ich das Spiel ganz normal mit finish() und starte eine neue Activity. Meistens funktioniert alles auch ganz gut aber manchmal stürzt die App an dieser Stelle einfach ab und ich bekomme folgendes Stacktrace:

java.lang.NullPointerException
at com.android.gamedev.f.onDraw(Unknown Source)
at com.android.gamedev.c.run(Unknown Source)

Wieso passiert das?
 
Warum das passiert? Weil ein Objekt, welches du in irgendeiner Art und Weise verarbeitest und zugreifen willst "null" ist. Deshalb auch die NullPointerException.

Für mehr wäre etwas Code sinnvoll ;)
 
Hmm ok. Aber was ich dann nicht verstehe, warum es manchmal funktioniert und manchmal nicht...
 
Scheinbar wird das betroffene Objekt manchmal initalisiert und manchmal nicht, daher tritt der Fehler auch nur manchmal auf, wenn also bestimmte Bedingungen zutreffen bzw. auch nicht zutreffen.

Ursache könnten die falsche Veschachtelung von if Schleifen sein, defekte try / catch Konstrukte usw.+

Wie gesagt ohne etwas Code ist das nur Rätselraten.

Lass Dir doch einfach mal im Logcat die Zustände deiner Spielobjekte ausgeben, dann findest du bestimmt den Fehler.
 
Hier der Code. Die GameView Klasse malt alles auf den Bildschirm und überprüft ständig auf Kollision. Bei Kollision endet das Spiel und die GameOverActivity wird gestartet.

GameView Klasse:

PHP:
public class GameView extends SurfaceView {

    private SurfaceHolder surfaceHolder;
    
    private Bitmap eins;
    private Bitmap zwei;
    private Bitmap drei;
    private Bitmap vier;
    private Bitmap fünf;
    private GameLoopThread theGameLoopThread;
    private Sprite theSprite;
    private RedSprite theSprite5;
    private SecondSprite theSprite2;
    private ThridSprite theSprite3;
    private FourthSprite theSprite4;
    private GameActivity theGameActivity = new GameActivity();
    //private float density;

    private boolean spritetouched = false;
    short collision = 0;
    public static short beginGame = 0;
    
    long startTime;
    long endTime;
    long sec;
    long mill;
    long score;

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

        theGameActivity = (GameActivity) context;
        theGameLoopThread = new GameLoopThread(this);
        surfaceHolder = getHolder();
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {

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

                    }
                }

            
            }

            public void surfaceCreated(SurfaceHolder holder) {
                theGameLoopThread.setRunning(true);
                theGameLoopThread.start();
            }

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

            }
        });

        eins = BitmapFactory.decodeResource(getResources(), R.drawable.quadrat);
        theSprite = new Sprite(this, eins);

        zwei = BitmapFactory.decodeResource(getResources(),    R.drawable.rechteck);
        theSprite2 = new SecondSprite(this, zwei);

        drei = BitmapFactory.decodeResource(getResources(),    R.drawable.hochrechteck);
        theSprite3 = new ThridSprite(this, drei);

        vier = BitmapFactory.decodeResource(getResources(), R.drawable.kleinrechteck);
        theSprite4 = new FourthSprite(this, vier);

        fünf = BitmapFactory.decodeResource(getResources(), R.drawable.rot);
        theSprite5 = new RedSprite(this, fünf);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        synchronized (getHolder()) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:

                if (theSprite5.isTouched(event.getX(), event.getY())) {
                    this.spritetouched = true;
                    if(beginGame == 0){                    
                    beginGame = 1;
                    startTime = System.currentTimeMillis();
                    }
                    
                } else {
                    this.spritetouched = false;
                }
                break;
                
            case MotionEvent.ACTION_MOVE:

                if (this.spritetouched == true) {
                    float xx = event.getX();
                    float yy = event.getY();
                    theSprite5.onNewPosition(xx, yy);    
                }
                break;
                
            case MotionEvent.ACTION_UP:
                break;
                }
            }
            return true;
        }
    


    public void collision() {

        Rect r1 = theSprite.bounds(); 
        Rect r2 = theSprite2.bounds();
        Rect r3 = theSprite3.bounds();
        Rect r4 = theSprite4.bounds(); 
        Rect r5 = theSprite5.bounds(); 

        if (r5.intersect(r1) || r5.intersect(r2) || r5.intersect(r3)|| r5.intersect(r4)) {

        if (collision == 0){
            collision = 1;
            endTime = System.currentTimeMillis() - startTime;
            score = (System.currentTimeMillis() - startTime);            
        }
    
        }
    
    }
    
    public void doWeHaveCollision(){
        if (collision == 1){
            collision = 2;
            theGameActivity.onGameOver();
        }
    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        theSprite.onDraw(canvas);
        theSprite2.onDraw(canvas);
        theSprite3.onDraw(canvas);
        theSprite4.onDraw(canvas);
        theSprite5.onDraw(canvas);
        collision();
        doWeHaveCollision();
    }

    public long getScore() {
        return this.score;
    }

}




GameOver Klasse
PHP:
public class GameOverActivity extends Activity {
    
    MediaPlayer gameover;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        gameover = MediaPlayer.create(this, R.raw.gameover);
        gameover.start();
        getWindow().setFormat(PixelFormat.RGBA_8888);
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
        setContentView(R.layout.gameover);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        options.inDither = true;
        options.inScaled = false;
        options.inDither = false;
        options.inPurgeable = true;
        Bitmap preparedBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.gameover, options);
        Drawable background = new BitmapDrawable(preparedBitmap);
        ((RelativeLayout) findViewById(R.id.gameover)).setBackgroundDrawable(background);
        initialize();
        ImageButton retryButton = (ImageButton) findViewById (R.id.retry);
        retryButton.setOnClickListener(new OnClickListener(){

            public void onClick(View arg0) {
                finish();
                Intent theNextIntent = new Intent(getApplicationContext(), GameActivity.class);
                startActivity(theNextIntent);
                
            }
            
        });
        
        ImageButton exitgameover = (ImageButton) findViewById (R.id.exit_gameover);
        exitgameover.setOnClickListener(new OnClickListener(){

            public void onClick(View arg0) {
                finish();
                Intent theNextIntent = new Intent(getApplicationContext(), MenuActivity.class);
                startActivity(theNextIntent);
                
            }
            
        });
    }

    public void initialize() {
        long score = this.getIntent().getExtras().getLong("score");
        long sec = score / 1000;
        long mill = score % 1000;
        long sec1 = readHighscore() / 1000;
        long mill1 = readHighscore() % 1000;
        
        TextView tvScore = (TextView) findViewById(R.id.textView2);
        TextView tvHighScore = (TextView) findViewById(R.id.textView3);
        Typeface font = Typeface.createFromAsset(getAssets(), "calibri.ttf");  
        tvScore.setTypeface(font);
        tvHighScore.setTypeface(font);
        tvScore.setShadowLayer(2, 2, 2, Color.BLACK);
        tvHighScore.setShadowLayer(2, 2, 2, Color.BLACK);
        tvScore.setText("" + sec + "." + mill + " seconds");
        tvHighScore.setText("" + sec1 + "." + mill1 + " seconds");
    
    }
    
    public long readHighscore() {
        SharedPreferences pref = getSharedPreferences("GAME", 0);        
        return pref.getLong("HIGHSCORE", 0);
    }

}
 
Will mir keiner helfen :((
 
Naja schau doch mal deine onDraw-Funktion genauer an, da dort ja der Fehler ausgelöst wird.

Hast ja viele Möglichkeiten: bau einen Try-Catch-Block drum, schmeiß den Debugger an, lass dir die Variablen ausgeben (lass einfach die Variablen ins Log laufen, da siehst du, ob die null sind oder existieren), kommentier Zeilen aus etc...

Kannst du den Fehler nachstellen? Dein logcat sieht mir nach Fehlerbericht aus der Dev Console aus (da ProGuard aktiviert). Mit einem richtigen Logcat kannst du ja die Zeile genauer nachvollziehen, welche die Exception auslöst.
 

Ähnliche Themen

G
Antworten
0
Aufrufe
151
Gerdchen07
G
G
Antworten
1
Aufrufe
396
Gerdchen07
G
G
Antworten
13
Aufrufe
628
Gerdchen07
G
L
Antworten
3
Aufrufe
688
mips400
mips400
migi01
Antworten
26
Aufrufe
2.047
migi01
migi01
Zurück
Oben Unten