Taschenrechner App Grundrechenarten Fehler! Hilfe! OnClickListener

  • Antworten:10
  • Bentwortet
Hannes Beck
  • Forum-Beiträge: 16

09.01.2015, 13:44:13 via Website

Hallo, ich habe heute versucht eine neue Taschenrechner app mit den Grundrechenarten zu programmieren. Leider bekomme ich eine Fehlermeldung aufgrund meines onClickListeners und weis nicht warum.
Hier ist mein Quelltext ich habe die Stelle markiert wo angeblich der Fehler sein soll. unten hab ich noch den Fehler Log von Logcat eingefügt (den relevanten Teil) ... Ich freu mich auf Antworten :)

public class MainActivity extends ActionBarActivity {
private Button plus, minus, mal, div;
private TextView tvErgebnis;
private EditText zahl1, zahl2;
double z1;
double z2;
double erg;

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

    plus = (Button) findViewById(R.id.bPlus);
    minus = (Button) findViewById(R.id.bMinus);
    mal = (Button) findViewById(R.id.bMal);
    div = (Button) findViewById(R.id.bDiv);
    tvErgebnis = (TextView) findViewById(R.id.tvErgebnis);
    zahl1 = (EditText) findViewById(R.id.edZahl1);
    zahl2 = (EditText) findViewById(R.id.edZahl2);

    plus.setOnClickListener(new View.OnClickListener() {           //Hier wird mir der Fehler angezeigt!!!!!!!!!!
        @Override
        public void onClick(View v) {
            z1 = Double.parseDouble(zahl1.getText().toString());
            z2 = Double.parseDouble(zahl2.getText().toString());
            erg = z1 + z2;

            tvErgebnis.setText(String.valueOf(erg));
        }
    });

}

Logcat:

01-09 12:32:12.466    1353-1353/de.mr_ac_dev.gfsinformatikeinfacherrechner E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: de.mr_ac_dev.gfsinformatikeinfacherrechner, PID: 1353
java.lang.RuntimeException: Unable to start activity ComponentInfo{de.mr_ac_dev.gfsinformatikeinfacherrechner/de.mr_ac_dev.gfsinformatikeinfacherrechner.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
        at android.app.ActivityThread.access$800(ActivityThread.java:144)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at de.mr_ac_dev.gfsinformatikeinfacherrechner.MainActivity.onCreate(MainActivity.java:35)
        at android.app.Activity.performCreate(Activity.java:5933)
        [...]

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.01.2015, 14:30:42 via Website

Hallo Hannes,
gibt dir die IDE an der stelle einen Fehler aus oder nimmst du das aus dem Debugger?
So wie es aussieht kommt die NullPointerException vom Button, da er nicht auf dem Layout gefunden wird.

Wie sieht denn deine XML Layout Datei aus?
Gibt es da dien Button bPlus?

LG Pascal

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

Hannes Beck

Antworten
Hannes Beck
  • Forum-Beiträge: 16

10.01.2015, 11:11:16 via Website

Du bist der Boss :)
Der Fehler war, dass ich nicht die ID des Buttons zu bPlus geändert habe, sondern die ausrichtung des Layouts an diese ID.
Kommt davon wenn man immer alles so schnell macht xDD.
Danke nochmal :)

Antworten
Hannes Beck
  • Forum-Beiträge: 16

10.01.2015, 11:52:17 via Website

Eine Frage noch, was bedeutet die folgende LogCat Warnung?

01-10 10:46:38.194    1210-1225/de.mr_ac_dev.gfsinformatikeinfacherrechner W/EGL_emulation﹕ eglSurfaceAttrib not implemented
01-10 10:46:38.195    1210-1225/de.mr_ac_dev.gfsinformatikeinfacherrechner W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on 
surface 0xa7bb8020, error=EGL_SUCCESS

Das ist der einzigste Fehler den ich in LogCat noch angezeigt bekomme die App funktioniert zwar, ich würde diesen aber gerne trotzdem beheben :)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.01.2015, 11:56:37 via App

Das ist etwas aus dem Emulator und hat mit Android zutun das kannst du nicht beheben nur Ignorieren ;)

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

Hannes Beck

Antworten
Hannes Beck
  • Forum-Beiträge: 16

10.01.2015, 12:16:09 via Website

OK gut. Wenn man keine Zahlen eingibt stürzt die Taschenrechner App ja logischerweise ab, wie könnte ich das mit try and catch abfangen? :)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.01.2015, 12:50:36 via Website

Da gibt es 2 möglichkeiten:
Entweder du machst es mit try&catch [in der onClick]:

try{
 z1 = Double.parseDouble(zahl1.getText().toString());
            z2 = Double.parseDouble(zahl2.getText().toString());
            erg = z1 + z2;

            tvErgebnis.setText(String.valueOf(erg));
}
catch(Exception ex)
{
Log.d("Parser Error",ex.toString()); //VLt noch eine Infobox anzeigen
}

Oder du erstellst einen Filter der nur Zahlen zulässt, somit kannst du nur Zahlen in dein Feld eingeben.Stichwort edittext input type numberDecimal http://developer.android.com/reference/android/widget/TextView.html#attr_android%3ainputType.

Ich würde beides benutzen, dann kann kein Fehler beim parsen mehr auftreten.

GL

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

Hannes Beck

Antworten
Hannes Beck
  • Forum-Beiträge: 16

11.01.2015, 14:54:52 via Website

Danke :) Das EditText hatte ich sogar schon auf decimal gestellt, das mit dem try and catch mach ich jetzt auch noch.
Das war der Teil der mir dazu gefehlt hat:

catch(Exception ex)
{
Log.d("Parser Error",ex.toString()); //VLt noch eine Infobox anzeigen
}

Wie kommt man auf dieses Exception ex und das Log.d...blablabla ? :) Oder ist das was zum auswendig lernen?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.01.2015, 15:00:29 via Website

Das ist eher etwas was man wissen sollte.

Denn wenn eine exception auftritt kann ja der code nicht weiter ausgeführt werden, deswegen gibt es den Catch Block in den dein programm eingeht wenn eine Exception aufgetreten ist.
Dann musst du selber behandeln was bei einem Fehler passieren soll. Das mit dem Log.d() ist ein Standartcode von mir damit die Exception im Log (logCat) ausgegeben wird.
Sonst bekommst du beim entwickeln nicht mit dass da überhapt eine Exception aufgetreten ist.

Wie gesagt du kannst da auch noch eigenen Code hinzufügen.
Hier mal nen Beispiel: http://stackoverflow.com/questions/3805855/sample-code-to-handle-exceptions

LG Pascal

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

Antworten
Hannes Beck
  • Forum-Beiträge: 16

11.01.2015, 15:17:19 via Website

Funktioniert, Danke :)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.01.2015, 15:21:22 via Website

Bitte setze deinen Thread noch auf Beantwortet, idem du im Browser über deinem ersten Post auf "Mehr"->"Beantwortet" klickst.
Danke (smug)

LG Pascal

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

Hannes Beck

Antworten