App stürzt bei Klick auf Button ab

  • Antworten:33
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 18

25.06.2018, 22:19:08 via Website

Guten Abend,
Meine App stürzt beim Klicken auf den Button ab.
Bin Neuling in Sachen Programmierung und hoffe einer kann mir helfen.
Habe schon über zwei Stunden das Internet durchstöbert aber noch keine Lösung gefunden.

Hier noch mein Logcat zum absturz:

06-25 20:12:18.108 2635-2635/? I/art: Not late-enabling -Xcheck:jni (already on)
06-25 20:12:18.108 2635-2635/? W/art: Unexpected CPU variant for X86 using defaults: x86
06-25 20:12:18.439 2635-2635/com.quiz.football.fuballquiz W/System: ClassLoader referenced unknown path: /data/app/com.quiz.football.fuballquiz-2/lib/x86
06-25 20:12:18.448 2635-2635/com.quiz.football.fuballquiz I/InstantRun: starting instant run server: is main process
06-25 20:12:18.824 2635-2652/com.quiz.football.fuballquiz I/OpenGLRenderer: Initialized EGL, version 1.4
06-25 20:12:18.824 2635-2652/com.quiz.football.fuballquiz D/OpenGLRenderer: Swap behavior 1
06-25 20:12:18.825 2635-2652/com.quiz.football.fuballquiz W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
06-25 20:12:18.825 2635-2652/com.quiz.football.fuballquiz D/OpenGLRenderer: Swap behavior 0
06-25 20:12:18.845 2635-2652/com.quiz.football.fuballquiz D/EGL_emulation: eglCreateContext: 0xa6fc2f20: maj 2 min 0 rcv 2
06-25 20:12:18.918 2635-2652/com.quiz.football.fuballquiz D/EGL_emulation: eglMakeCurrent: 0xa6fc2f20: ver 2 0 (tinfo 0xa6fbe630)
06-25 20:12:18.932 2635-2652/com.quiz.football.fuballquiz D/EGL_emulation: eglMakeCurrent: 0xa6fc2f20: ver 2 0 (tinfo 0xa6fbe630)
06-25 20:12:43.353 2635-2635/com.quiz.football.fuballquiz D/AndroidRuntime: Shutting down VM

--------- beginning of crash

06-25 20:12:43.354 2635-2635/com.quiz.football.fuballquiz E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.quiz.football.fuballquiz, PID: 2635
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.quiz.football.fuballquiz/com.quiz.football.fuballquiz.Spiel}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.quiz.football.fuballquiz.Spiel.frageLaden(Spiel.java:74)
at com.quiz.football.fuballquiz.Spiel.onCreate(Spiel.java:36)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 

Vielen Danke an alle!

Liebe Grüße
Pascal

— geändert am 25.06.2018, 22:28:32

Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 483

26.06.2018, 18:56:06 via Website

Hallo
Der Fehler liegt in deiner Fragen Klasse. In der Liste „fragen“ ist der zweite Eintrag lehr.
Du erstellst eine Variable „frage2[]“ weist aber der Variable frage1[] die Fragen zu.
Somit ist das zweite Add lehr.

private void listeFuellen(){
String[] frage1 = new String[5];
frage1[0] = "Wer wurde 2014 Weltmeister?";
frage1[1] = "Deutschland";
frage1[2] = "Mexico";
frage1[3] = "Spanien";
frage1[4] = "Frankreich";

    String[] frage2 = new String[5];
    frage1[0] = "Wer wurde in der Saison 2017/18 DFB-Pokal Sieger?";
    frage1[1] = "Eintacht Frankfurt";
    frage1[2] = "FC Bayern München";
    frage1[3] = "Borussia Dortmund";
    frage1[4] = "FC Schalke 04";

fragen.add(0, frage1);
fragen.add(1, frage2);

}

besser so

String[] frage2 = new String[5];
frage2[0] = "Wer wurde in der Saison 2017/18 DFB-Pokal Sieger?";
frage2[1] = "Eintacht Frankfurt";
frage2[2] = "FC Bayern München";
frage2[3] = "Borussia Dortmund";
frage2[4] = "FC Schalke 04";

Außerdem ist dein Intent falsch.
Das putExtr musst du auf den Intent ausführen

Intent intent = new Intent(this, Ende.class);
getIntent().putExtra("Punkte", punkte);
startActivity(intent);

Ändern sonnst kommt in der Activity nichts an.

Intent intent = new Intent(this, Ende.class);
intent.putExtra("Punkte", punkte);
startActivity(intent);

ansonsten hat Pascal schon recht mit der Strucktur.
Ich würde die Fragen in einer Datebank speichern. Denk da mal darüber nach.

Warum die App abstürzt weist du jetzt der Fehler dürfe erst bei der zweiten Frage kommen.

— geändert am 26.06.2018, 19:03:42

Hilfreich?
Diskutiere mit!
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.167

25.06.2018, 22:35:28 via Website

Hallo und herzlich willkommen im Forum (*)

ComponentInfo{com.quiz.football.fuballquiz/com.quiz.football.fuballquiz.Spiel}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 

Dein TextView wurde nicht richtig bzw. falsch initialisiert - von dir - ohne Code wird es schwer ;-)

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 18

25.06.2018, 22:39:32 via App

Oh ok Danke schonmal. Welchen Abschnitt bräuchstest du denn? den mit der OnClickMethode noch auf der ersten Activity oder etwas von der zweiten Activity? :)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 18

25.06.2018, 22:47:36 via Website

package com.quiz.football.fuballquiz;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.ArrayList;

public class Spiel extends Activity implements View.OnClickListener{

Button btnAntwortEins, btnAntwortZwei, btnAntwortDrei, btnAntwortVier;
TextView tvFrageAnzeigen, tvScore;
int aktuelleFrage =0;
int punkte = 0;

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

    btnAntwortEins = (Button) findViewById(R.id.btnAntwortEins);
    btnAntwortZwei = (Button) findViewById(R.id.btnAntwortZwei);
    btnAntwortDrei = (Button) findViewById(R.id.btnAntwortDrei);
    btnAntwortVier = (Button) findViewById(R.id.btnAntwortVier);

    tvFrageAnzeigen = (TextView) findViewById(R.id.tVAnzeigeFrage);
    tvScore = (TextView) findViewById(R.id.tVScore);

    btnAntwortEins.setOnClickListener(this);
    btnAntwortZwei.setOnClickListener(this);
    btnAntwortDrei.setOnClickListener(this);
    btnAntwortVier.setOnClickListener(this);
    frageLaden();
}
Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

26.06.2018, 05:21:19 via Website

Hallo von mir auch ein Willkommen.
Deine beiden textView sehen bis hier hin ok aus . Wenn es auch die Id gibt und gefunden wird.
Sind die views auch in dem aktuell geladenen layut vorhanden?

Wir bräuchten nun die Zeilen wo du etwas mit den textView machst.
tvFrageAnzeigen, tvScore.

LG. J.

— geändert am 26.06.2018, 05:25:15

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 18

26.06.2018, 06:57:03 via Website

package com.quiz.football.fuballquiz;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.ArrayList;

public class Spiel extends Activity implements View.OnClickListener{

Button btnAntwortEins, btnAntwortZwei, btnAntwortDrei, btnAntwortVier;
TextView tvFrageAnzeigen, tvScore;
int aktuelleFrage =0;
int punkte = 0;

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

    btnAntwortEins = (Button) findViewById(R.id.btnAntwortEins);
    btnAntwortZwei = (Button) findViewById(R.id.btnAntwortZwei);
    btnAntwortDrei = (Button) findViewById(R.id.btnAntwortDrei);
    btnAntwortVier = (Button) findViewById(R.id.btnAntwortVier);

    tvFrageAnzeigen = (TextView) findViewById(R.id.tVAnzeigeFrage);
    tvScore = (TextView) findViewById(R.id.tVScore);

    btnAntwortEins.setOnClickListener(this);
    btnAntwortZwei.setOnClickListener(this);
    btnAntwortDrei.setOnClickListener(this);
    btnAntwortVier.setOnClickListener(this);
    frageLaden();
}

private void frageLaden(){
    Fragen fragenC = new Fragen();
    ArrayList<String[]> fragen = fragenC.getFragen();
    String[] frage = fragen.get(aktuelleFrage);

    tvFrageAnzeigen.setText(frage[0]);

    int zufallszahl = (int) (Math.random() * (4-1) + 1);

    switch(zufallszahl){
        case 1:
            btnAntwortEins.setText(frage[1]);
            btnAntwortZwei.setText(frage[2]);
            btnAntwortDrei.setText(frage[3]);
            btnAntwortVier.setText(frage[4]);
            break;
        case 2:
            btnAntwortEins.setText(frage[4]);
            btnAntwortZwei.setText(frage[1]);
            btnAntwortDrei.setText(frage[2]);
            btnAntwortVier.setText(frage[3]);
            break;
        case 3:
            btnAntwortEins.setText(frage[3]);
            btnAntwortZwei.setText(frage[4]);
            btnAntwortDrei.setText(frage[1]);
            btnAntwortVier.setText(frage[2]);
            break;
        case 4:
            btnAntwortEins.setText(frage[2]);
            btnAntwortZwei.setText(frage[2]);
            btnAntwortDrei.setText(frage[4]);
            btnAntwortVier.setText(frage[1]);
            break;
    }
    tvScore.setText("Punkte: " + punkte);
}
Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

26.06.2018, 08:23:09 via Website

Hallo diese Zuweisungen geht so nicht.

String[] frage = fragen.get(aktuelleFrage);
tvFrageAnzeigen.setText(frage[0]);

Du hast dem Array noch keinen Speicher zugeortnet.
Deshalb ist "fage[0]" auch Null.

Wie siet denn die Methode "fragen" aus gibt die auch ein String Array zurück oder nur einenen String?

String[] frage = new String[4];
frage[0] = fragen.get(aktuelleFrage); // bei einen String
frage = fragen.get(aktuelleFrage); // bei String Array
tvFrageAnzeigen.setText(frage[0]);

— geändert am 26.06.2018, 08:36:21

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 18

26.06.2018, 16:00:23 via Website

package com.quiz.football.fuballquiz;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.ArrayList;

public class Spiel extends Activity implements View.OnClickListener{

Button btnAntwortEins, btnAntwortZwei, btnAntwortDrei, btnAntwortVier;
TextView tvFrageAnzeigen, tvScore;
int aktuelleFrage =0;
int punkte = 0;

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

    btnAntwortEins = (Button) findViewById(R.id.btnAntwortEins);
    btnAntwortZwei = (Button) findViewById(R.id.btnAntwortZwei);
    btnAntwortDrei = (Button) findViewById(R.id.btnAntwortDrei);
    btnAntwortVier = (Button) findViewById(R.id.btnAntwortVier);

    tvFrageAnzeigen = (TextView) findViewById(R.id.tVAnzeigeFrage);
    tvScore = (TextView) findViewById(R.id.tVScore);

    btnAntwortEins.setOnClickListener(this);
    btnAntwortZwei.setOnClickListener(this);
    btnAntwortDrei.setOnClickListener(this);
    btnAntwortVier.setOnClickListener(this);
    frageLaden();
}

private void frageLaden(){
    Fragen fragenC = new Fragen();
    ArrayList<String[]> fragen = fragenC.getFragen();
    String[] frage = fragen.get(aktuelleFrage);

    tvFrageAnzeigen.setText(frage[0]);

    int zufallszahl = (int) (Math.random() * (4-1) + 1);

    switch(zufallszahl){
        case 1:
            btnAntwortEins.setText(frage[1]);
            btnAntwortZwei.setText(frage[2]);
            btnAntwortDrei.setText(frage[3]);
            btnAntwortVier.setText(frage[4]);
            break;
        case 2:
            btnAntwortEins.setText(frage[4]);
            btnAntwortZwei.setText(frage[1]);
            btnAntwortDrei.setText(frage[2]);
            btnAntwortVier.setText(frage[3]);
            break;
        case 3:
            btnAntwortEins.setText(frage[3]);
            btnAntwortZwei.setText(frage[4]);
            btnAntwortDrei.setText(frage[1]);
            btnAntwortVier.setText(frage[2]);
            break;
        case 4:
            btnAntwortEins.setText(frage[2]);
            btnAntwortZwei.setText(frage[2]);
            btnAntwortDrei.setText(frage[4]);
            btnAntwortVier.setText(frage[1]);
            break;
    }
    tvScore.setText("Punkte: " + punkte);
}

@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.btnAntwortEins:
            if (frageAuswerten(btnAntwortEins.getText().toString())){
                punkte++;
            }
            if (aktuelleFrage >=1){
                Intent intent = new Intent(this, Ende.class);
                getIntent().putExtra("Punkte", punkte);
                startActivity(intent);
            }else{
                aktuelleFrage++;
                frageLaden();
            }
            break;
        case R.id.btnAntwortZwei:
            if (frageAuswerten(btnAntwortZwei.getText().toString())){
                punkte++;
            }
            if (aktuelleFrage >=1){
                Intent intent = new Intent(this, Ende.class);
                getIntent().putExtra("Punkte", punkte);
                startActivity(intent);
            }else{
                aktuelleFrage++;
                frageLaden();
            }
            break;
        case R.id.btnAntwortDrei:
            if (frageAuswerten(btnAntwortDrei.getText().toString())){
                punkte++;
            }
            if (aktuelleFrage >=1){
                Intent intent = new Intent(this, Ende.class);
                getIntent().putExtra("Punkte", punkte);
                startActivity(intent);
            }else{
                aktuelleFrage++;
                frageLaden();
            }
            break;
        case R.id.btnAntwortVier:
            if (frageAuswerten(btnAntwortVier.getText().toString())){
                punkte++;
            }
            if (aktuelleFrage >=1){
                Intent intent = new Intent(this, Ende.class);
                getIntent().putExtra("Punkte", punkte);
                startActivity(intent);
            }else{
                aktuelleFrage++;
                frageLaden();
            }
            break;
    }
}

private boolean frageAuswerten(String btnText){
    boolean frage = false;
    Fragen fragenC = new Fragen();
    ArrayList fragen = fragenC.getFragen();
    String[] speicher = (String[]) fragen.get(aktuelleFrage);
    if (speicher[1].equals(btnText)){
        frage = true;
    }
    return frage;
}

}

Wie muss der Code denn abgeändert werden? :)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 18

26.06.2018, 16:19:41 via Website

Und das ist der Quellcode der Klasse "Fragen":

package com.quiz.football.fuballquiz;

import java.util.ArrayList;

public class Fragen {

ArrayList<String[]> fragen;

public Fragen(){
    fragen = new ArrayList<>(2);

    listeFuellen();
}

private void listeFuellen(){
    String[] frage1 = new String[5];
    frage1[0] = "Wer wurde 2014 Weltmeister?";
    frage1[1] = "Deutschland";
    frage1[2] = "Mexico";
    frage1[3] = "Spanien";
    frage1[4] = "Frankreich";

    String[] frage2 = new String[5];
    frage1[0] = "Wer wurde in der Saison 2017/18 DFB-Pokal Sieger?";
    frage1[1] = "Eintacht Frankfurt";
    frage1[2] = "FC Bayern München";
    frage1[3] = "Borussia Dortmund";
    frage1[4] = "FC Schalke 04";

    fragen.add(0, frage1);
    fragen.add(1, frage2);
}

public ArrayList<String[]> getFragen(){
    return fragen;
}

}

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.177

26.06.2018, 18:01:24 via Website

Hallo Kernbeisser,

nur als Tipp:

Anstatt dir alles in deinem komplexen Konstrukt der List of String[] zu halten würde ich mir ein Fragen Objekt bauen:

public class Frage {

private String frage;
private List<Antwort> antworten;

public Frage(String frage,Antworten... antworten){
  this.frage = frage;
  antworten = new ArrayList<Antwort>(antworten);
  }

public String getFrage(){
   return frage;
   }

 public List<Antwort> getAntworten(){
   return this.antworten;
    }
}

public class Antwort{
  private String antwort;
  private boolean isRight;

public Antwort(String antwort,boolean isRight)[
  this.antwort = antwort;
  this.isRight = isRight;
  }
  //getter+setter...
}

Wenn du das so machst, dann kannst ud dir ganz einfach eine Objekt Struktur daraus bauen:

Frage frage = new Frage("Wie findest du AndroidPit?",new Antwort("super",true),new Antwort("cool",false),new Antwort("toll",false));

zudem kannst du dann über Frage und Antworten iterieren und die in ein paar Zeilen dann auf die UI Elemente setzen :)
Das würde deinen Code schonmal deutlich übersichtlicher machen.

— geändert am 26.06.2018, 18:01:50

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 483

26.06.2018, 18:56:06 via Website

Hallo
Der Fehler liegt in deiner Fragen Klasse. In der Liste „fragen“ ist der zweite Eintrag lehr.
Du erstellst eine Variable „frage2[]“ weist aber der Variable frage1[] die Fragen zu.
Somit ist das zweite Add lehr.

private void listeFuellen(){
String[] frage1 = new String[5];
frage1[0] = "Wer wurde 2014 Weltmeister?";
frage1[1] = "Deutschland";
frage1[2] = "Mexico";
frage1[3] = "Spanien";
frage1[4] = "Frankreich";

    String[] frage2 = new String[5];
    frage1[0] = "Wer wurde in der Saison 2017/18 DFB-Pokal Sieger?";
    frage1[1] = "Eintacht Frankfurt";
    frage1[2] = "FC Bayern München";
    frage1[3] = "Borussia Dortmund";
    frage1[4] = "FC Schalke 04";

fragen.add(0, frage1);
fragen.add(1, frage2);

}

besser so

String[] frage2 = new String[5];
frage2[0] = "Wer wurde in der Saison 2017/18 DFB-Pokal Sieger?";
frage2[1] = "Eintacht Frankfurt";
frage2[2] = "FC Bayern München";
frage2[3] = "Borussia Dortmund";
frage2[4] = "FC Schalke 04";

Außerdem ist dein Intent falsch.
Das putExtr musst du auf den Intent ausführen

Intent intent = new Intent(this, Ende.class);
getIntent().putExtra("Punkte", punkte);
startActivity(intent);

Ändern sonnst kommt in der Activity nichts an.

Intent intent = new Intent(this, Ende.class);
intent.putExtra("Punkte", punkte);
startActivity(intent);

ansonsten hat Pascal schon recht mit der Strucktur.
Ich würde die Fragen in einer Datebank speichern. Denk da mal darüber nach.

Warum die App abstürzt weist du jetzt der Fehler dürfe erst bei der zweiten Frage kommen.

— geändert am 26.06.2018, 19:03:42

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 18

26.06.2018, 20:16:35 via Website

Vielen Lieben Dank! :)
Eine Frage habe ich noch. Wie soll ich die Datenbank estellen damit diese auch zu einem "QUIZ" passt?

LG
Pascal :)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

26.06.2018, 20:44:41 via Website

Wie weit kennst du dich den mit DB aus.
Wenn nicht dann schaue dir dazu ein paar tutorial an . Sowie die Grundlagen von SQL.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 18

26.06.2018, 21:00:07 via Website

Allerdings habe ich grad gesehen als ich die App ausprobiert habe, dass der Absturz immer noch passiert. :(

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 18

26.06.2018, 21:05:59 via Website

Ich weiß nun nicht genau was ich ersetzten soll. Denn ich möchte nichts wichtiges entfernen :(

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

26.06.2018, 22:01:11 via Website

Bei mir ist es gelaufen.
Wann Stürzt es ab?

Hilfreich?
Diskutiere mit!

Empfohlene Artikel