Android App stürzt ab sobald ich den Button anklicke

D

derkevin92

Neues Mitglied
0
Hallo, ich bin hier gerade auf der Fehlersuche warum die App abstürzt nachdem ich den Button geklickt habe.

Habe die App 1 zu 1 einem Tutorial nachgemacht aber ich habe Android Studio anstatt Eclipse verwendet. Ich dachte es sollte auch so gehen.

Ganz am Anfang steht da ja NullPointerException, ich habe die Stickies gelesen dazu aber das hat mir in dem Fall einfach nicht weitergeholfen, da dass sich ja auf java bezieht und ich hier irgendwie mit dem Android Kram zu kämpfen habe.
Es wird auf ein Objekt zugegriffen das nicht existiert schätze ich mal aber die Ursache warum es noch nicht erzeugt worden ist, ist mir hier unklar. Habe extra darauf geachtet das die OnCreate methode ganz oben steht und alles eigentlich sauber ablaufen sollte....

PS: Bin noch ein ziemlicher Android Newbie über Hilfe oder auch nur Gedanken anstöße sehr dankbar :]

Logcat sagt folgendes:

09-08 19:42:59.763 8581-8581/com.example.mad.mueckenfang E/AndroidRuntime FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.mad.mueckenfang/com.example.mad.mueckenfang.GameActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2121)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240)
at android.app.ActivityThread.access$600(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:4987)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.app.Activity.findViewById(Activity.java:1851)
at com.example.mad.mueckenfang.GameActivity.<init>(GameActivity.java:34)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1319)
at android.app.Instrumentation.newActivity(Instrumentation.java:1039)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2112)
************at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240)
************at android.app.ActivityThread.access$600(ActivityThread.java:139)
************at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
************at android.os.Handler.dispatchMessage(Handler.java:99)
************at android.os.Looper.loop(Looper.java:156)
************at android.app.ActivityThread.main(ActivityThread.java:4987)
************at java.lang.reflect.Method.invokeNative(Native Method)
************at java.lang.reflect.Method.invoke(Method.java:511)
************at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
************at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
************at dalvik.system.NativeStart.main(Native Method)

Android Manifest:
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mad.mueckenfang" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MyActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".GameActivity"
            android:label="@string/title_activity_game" >
        </activity>
    </application>

</manifest>

GameActivity:
Code:
package com.example.mad.mueckenfang;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Handler;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.Date;
import java.util.Random;


public class GameActivity extends Activity implements View.OnClickListener, Runnable {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

    }

    boolean spielLaeuft;
    int runde, punkte, gefangeneMuecken, muecken, zeit;
    private float massstab;
    private Random zufallsgenerator = new Random();
    private static final long HOECHSTALTER_MS = 2000;
    FrameLayout spielbereich = (FrameLayout)findViewById(R.id.spielbereich);

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.game, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private void spielStarten(){
        spielLaeuft = true;
        runde = 0;
        punkte = 0;
        starteRunde();
    }

    private void starteRunde(){
        runde++;
        muecken = runde * 10;
        gefangeneMuecken = 0;
        zeit = 60;
        bildschirmAktualisieren();
        handler.postDelayed(this,1000);
    }

    @Override
    public void run(){
        zeitHerunterzaehlen();
    }

    private void bildschirmAktualisieren(){

        TextView tvPunkte = (TextView)findViewById(R.id.points);
        tvPunkte.setText(Integer.toString(punkte));
        //TextView stellt immer Strings dar kein Int!! Deswegen Integer.toString(punkte)!

        TextView tvRunde = (TextView)findViewById(R.id.round);
        tvRunde.setText(Integer.toString(runde));

        FrameLayout flTreffer =(FrameLayout)findViewById(R.id.bar_hits);
        FrameLayout flZeit = (FrameLayout)findViewById(R.id.bar_time);

        massstab = getResources().getDisplayMetrics().density;
        ViewGroup.LayoutParams lpTreffer = flTreffer.getLayoutParams();

        lpTreffer.width = Math.round(massstab * 300 * Math.min(gefangeneMuecken,muecken) / muecken);

        ViewGroup.LayoutParams lpZeit = flZeit.getLayoutParams();
        lpZeit.width = Math.round(massstab * zeit * 300 / 60);

    }

    private void zeitHerunterzaehlen(){
        float zufallszahl = zufallsgenerator.nextFloat();
        double ZEITSCHEIBEN = 300/60;

        zeit--;

        double wahrscheinlichkeit = muecken * 1.5f / ZEITSCHEIBEN;

        if(wahrscheinlichkeit > 1 ){
            eineMueckeAnzeigen();
            if(zufallszahl < wahrscheinlichkeit -1){
                eineMueckeAnzeigen();
            }else{
                if(zufallszahl < wahrscheinlichkeit ){
                    eineMueckeAnzeigen();
                }
            }

            mueckenVerschwinden();
            bildschirmAktualisieren();
            if(!pruefeSpielende()){
                if(!pruefeRundenende()){
                    handler.postDelayed(this, 1000);
                };
            }
        }

    }

    private void eineMueckeAnzeigen(){
        int breite = spielbereich.getWidth();
        int hoehe = spielbereich.getHeight();

        int muecke_breite = (int) Math.round(massstab*50);
        int muecke_hoehe=(int) Math.round(massstab*50);

        int links = zufallsgenerator.nextInt(breite - muecke_breite);
        int oben = zufallsgenerator.nextInt(hoehe - muecke_hoehe);

        ImageView muecke = new ImageView(this);
        muecke.setImageResource(R.drawable.biene);
        muecke.setOnClickListener(this);

        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(muecke_breite, muecke_hoehe);
        params.leftMargin= links;
        params.topMargin=oben;
        params.gravity = Gravity.TOP + Gravity.LEFT;

        spielbereich.addView(muecke,params);
        muecke.setTag(R.id.geburtsdatum, new Date());
    }


    private void mueckenVerschwinden(){
        int nummer = 0;
        while(nummer < spielbereich.getChildCount()){
            ImageView muecke = (ImageView) spielbereich.getChildAt(nummer);
            nummer = nummer +1;

            Date geburtsdatum = (Date) muecke.getTag(R.id.geburtsdatum);
            long alter = (new Date()).getTime() - geburtsdatum.getTime();

            if (alter > HOECHSTALTER_MS){
                spielbereich.removeView(muecke);
            }else{
                nummer++;
            }
        }

    }

    private Handler handler = new Handler();

    @Override
    public void onClick(View muecke){
        gefangeneMuecken++;
        punkte +=100;
        bildschirmAktualisieren();
        spielbereich.removeView(muecke);
    }

    private void gameOver(){
     Dialog dialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
        dialog.setContentView(R.layout.gameover);
        dialog.show();
    }

    private boolean pruefeSpielende(){
        if(zeit == 0 && gefangeneMuecken < muecken){
            gameOver();
            return true;
        }
        return false;
    }

    private boolean pruefeRundenende(){
        if(zeit == 0){
            starteRunde();
            return true;
        }
        return false;
    }
}
 
sobald ich das verschiebe, können die anderen Methoden nicht mehr auf spielbereich zugreifen....

Hab die initialisierung jetzt 3mal vorgenommen, da wo ich immer den spielbereich gebraucht habe.

Nun funktioniert es soweit. Nur passiert noch nichts ... Muss mal schauen woran das liegt ^^

Danke für die Hilfe
 
Zuletzt bearbeitet:
Da fehlen grundlegende Java Kenntnisse:

Die Variablendeklaration muss ausserhalb vom onCreate stehen, wenn du von ausserhalb von onCreate darauf zugreifen willst.
Nur die Zuweisung sollte in selbiger erfolgen.
 
derkevin92 schrieb:
sobald ich das verschiebe, können die anderen Methoden nicht mehr auf spielbereich zugreifen....

???????????????????????????

Sage jetzt bitte nicht, das du die Deklaration FrameLayout spielbereich auch in die onCreate - Methode verschoben hast.

Ich mir gerade mal den Rest deines Codes angeschaut, und frage mich, wie du auf die Idee Activity implements Runnable gekommen bist.

Eine Activity als Runnable eines Handlers???

Der Rest sieht auch nicht wirklich schöner aus, warum stopfst du den dein gesamtes Spiel in eine Klasse (GameActivity). Java ist eine objektorientierte Sprache, da muss man nicht alles strukturiert programmieren.
 
derkevin92 schrieb:
Habe extra darauf geachtet das die OnCreate methode ganz oben steht und alles eigentlich sauber ablaufen sollte....

... du kannst den Code auch ganz nach unten Stellen, das ist dem Compiler ziemlich egal. Wichtig ist dass du dich an den Lebenszyklus hälst und darauf achtest, dass zur Laufzeit alles "bekannt" (optimalerweise: deklariert und initialisiert) ist.

Starting an Activity | Android Developers
basic-lifecycle.png

(Google hat sich richtig ins Zeug gelegt und mal das Diagramm etwas verschönert. Google ist einfach spitze! :rolleyes2:)
 

Ähnliche Themen

S
Antworten
8
Aufrufe
508
swa00
swa00
B
Antworten
4
Aufrufe
470
bb321
B
A
  • AnimaAngelo85
Antworten
1
Aufrufe
331
swa00
swa00
Zurück
Oben Unten