Android problem mit geschwindigkeitsberechnung app

dee_

Mitglied
hallo leute,
habe ein problem mit meiner app und wollte fragen ob einer von euch mir vllt. nen rat hat die logcat hab ich auch gleich mitgeschickt sobald ich zwei werte eingebe und auch berechne(calc) drücke stürzt mein programm ab weshalb, weis ich leider selbst nicht. meine vermutung ist das es i.wann mit den if-abfragen zu tun hat. da ich prüfe ob die felder leer sind.
danke schon im voraus.

Java:
package de.deeprojects.speedcalc;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class SpeedCalc extends Activity {
	private Button calc, delete;
	private EditText speed, time, way;

	/** LogCat */
	private static final String TAG = "StatusActivity";

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

		speed = (EditText) findViewById(R.id.speed);
		time = (EditText) findViewById(R.id.time);
		way = (EditText) findViewById(R.id.way);

		/** calc Button, berechne das leere Feld */
		calc = (Button) findViewById(R.id.calc);
		calc.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "click calc Button");

				double s = Double.parseDouble(speed.getText().toString());
				double t = Double.parseDouble(time.getText().toString());
				double w = Double.parseDouble(way.getText().toString());
				double erg = 0;

				/** abfragen ob min. 2 felder ausgefüllt sind */
				if (time != null && way != null || way != null && speed != null
						|| time != null && speed != null) {

					/** speed berechnen */
					if (speed == null) {
						erg = w / t;
						speed.setText("" + erg);
					}

					/** time berechnen */
					if (time == null) {
						erg = w / s;
						time.setText("" + erg);
					}

					/** way berechnen */
					if (way == null) {
						erg = s * t;
						way.setText("" + erg);
					}
				}
			}
		});

		/** delete Button, alle Felder leeren */
		delete = (Button) findViewById(R.id.del);
		delete.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "click delete Button");
				/** felder werden zurückgesetzt */
				speed.setText("");
				time.setText("");
				way.setText("");
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.menu, menu);
		return true;

	}

	public boolean onOptionsItemSelected(MenuItem item) {
		item.getItemId();
		setContentView(R.layout.about);
		return true;
	}

}

Code:
02-02 03:17:03.491: I/StatusActivity(1141): click calc Button
02-02 03:17:03.501: D/AndroidRuntime(1141): Shutting down VM
02-02 03:17:03.501: W/dalvikvm(1141): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-02 03:17:03.511: E/AndroidRuntime(1141): FATAL EXCEPTION: main
02-02 03:17:03.511: E/AndroidRuntime(1141): java.lang.NumberFormatException: 
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:267)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at java.lang.Double.parseDouble(Double.java:318)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at de.deeprojects.speedcalc.SpeedCalc$1.onClick(SpeedCalc.java:35)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at android.view.View.performClick(View.java:2485)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at android.view.View$PerformClick.run(View.java:9080)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at android.os.Handler.handleCallback(Handler.java:587)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at android.os.Handler.dispatchMessage(Handler.java:92)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at android.os.Looper.loop(Looper.java:123)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at android.app.ActivityThread.main(ActivityThread.java:3647)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at java.lang.reflect.Method.invokeNative(Native Method)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at java.lang.reflect.Method.invoke(Method.java:507)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-02 03:17:03.511: E/AndroidRuntime(1141): 	at dalvik.system.NativeStart.main(Native Method)
 
Offensichtlich stürzt dein Programm ab wenn du versuchst den Inhalt von Speed in ein Double umzuwandeln. Was steht denn in der Textbox drinnen? Möglicherweise kommt parseDouble mit Leerzeichen nicht zurecht, dann musst du die noch mit trim() entfernen.

Am besten wäre es, wenn du das EditText-View mit Input-Type so konfigurierst das der Benutzer möglichst wenig Blödsinn eingeben kann. Um eine Prüfung ob das ganze funktioniert, wirst du aber trotzdem nicht herumkommen.

In deinem Fall würde ja eine kleine Methode ala:

Java:
public static Double parseDouble(String val) {
     Double retVal = null;

     try {
        retVal = Double.parseDouble(val);
     } catch(NumberFormatException e) { }

     return retVal;
}
reichen. Diese Methode versucht den Wert in ein Double umzuwandeln, wenn null zurück kommt weißt du, dass das Format nicht gestimmt hat.

Und dann baust du dir noch Überprüfungen ein. Hier beispielsweise für speed:

Java:
  Double speed = parseDouble(deineTextview.getText().toString());
  if(speed == null) {
     Toast.makeText(getContext(), "Bitte eine Zahl eingeben!", Toast.LENGTH_SHORT).show();
  } else {
     // calc
  }
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben