Cómo analizar un doble de EditText a TextView? (Androide)

Realmente estoy empezando a aprender Java. Cuando ejecuto este código todo funciona bien hasta que dejo mis cuadros de EditText en el de vacío y pulse el botón de ejecución. Entonces consigo:

ERROR/AndroidRuntime(866): FATAL EXCEPTION: main ERROR/AndroidRuntime(866): java.lang.NumberFormatException: ERROR/AndroidRuntime(866): at org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:267) 

Supongo que cuando intento analizar un doble de cadena no obtiene ningún valor y crea un error. Me preguntaba cómo evitar este error y dar algún tipo de valor a la variable por lo que nunca está vacío? ¡Gracias por toda la ayuda!

 import android.app.Activity; import android.os.Bundle; import android.widget.EditText; import android.widget.TextView; import android.widget.Button; import android.view.View; import android.view.View.OnClickListener; public class Main extends Activity { private EditText noKids; private EditText noGumballs; private TextView noSum; private Button b; private Button br; double etKids = 0; double etGumballs = 0; private double tvSumIn = 0.00; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initControls(); } private void initControls() { noKids = (EditText) findViewById(R.id.xetKids); noGumballs = (EditText) findViewById(R.id.xetGumballs); noSum = (TextView) findViewById(R.id.tvSum); br = (Button) findViewById(R.id.xbtnReset); br.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { reset(); br.setVisibility(View.INVISIBLE); } private void reset() { noKids.setText(""); noGumballs.setText(""); noSum.setText(""); } }); b = (Button) findViewById(R.id.xbtnCalculate); b.setOnClickListener(new OnClickListener() { public void onClick(View v) { calculate(); br.setVisibility(View.VISIBLE); } private void calculate() { etKids = Double.parseDouble(noKids.getText().toString()); etGumballs = Double.parseDouble(noGumballs.getText().toString()); tvSumIn = etGumballs / etKids; String thisIsIt = new Double(tvSumIn).toString(); if(tvSumIn < 2){ noSum.setText(thisIsIt + " This is it "); }else{ noSum.setText("This is else"); } } }); } } 

Este es mi archivo main.xml y supongo que no hay nada especial que poner en manifiesto.

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="How many kids have you got?"></TextView> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" android:id="@+id/xetKids"> <requestFocus></requestFocus> </EditText> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="How many gumballs have you got?"></TextView> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" android:id="@+id/xetGumballs"></EditText> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Calculate" android:id="@+id/xbtnCalculate"></Button> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tvSum"></TextView> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/xbtnReset" android:text="Reset" android:onClick="selfDestruct" android:visibility="invisible"></Button> </LinearLayout> 

Aquí está el método JavaDoc para java.lang.Double, método parseDouble:

 /** * Parses the specified string as a double value. * * @param string * the string representation of a double value. * @return the primitive double value represented by {@code string}. * @throws NumberFormatException * if {@code string} is {@code null}, has a length of zero or * can not be parsed as a double value. * @since Android 1.0 */ 

Los valores vacíos no se consideran parseable. Es por eso que recibes esta excepción.

Puede introducir una comprobación adicional en su código para ver si la cadena en el archivo noKids EditText está vacía y, de ser así, establezca manualmente el valor en 0.0:

 noKidsStr = noKids.getText().toString(); if(noKidsStr == null || noKidsStr.isEmpty()) { etKids = 0.0; } else { etKids = Double.parseDouble(noKids.getText().toString()); } 

Sugiero escribir algún tipo de método de utilidad de conveniencia que puede reutilizar para todas las situaciones similares en el futuro.

debe envolver las sentencias Double.parseDouble .. en una cláusula try / catch para capturar cualquier NumberFormatExceptions y establecer otros valores donde fallan

editar:

 try{ etKids = Double.parseDouble(noKids.getText().toString()); } catch (final NumberFormatException e) { etKids = 1.0; } try{ etGumballs = Double.parseDouble(noGumballs.getText().toString()); } catch (final NumberFormatException e) { etGumballs = 1.0; } 

Dos cosas que puedes hacer: Primero, solo permite datos numéricos en el campo EditarTexto. En realidad, ya veo que ya hiciste eso. Normalmente uso android: numérico – este es el primero que he visto de android: inputType. Gracias por eso. =)

En segundo lugar, asegúrese de que tiene texto en su EditText con un simple cheque.

 if(noKids.getText().length() > 0) { etKids = Double.parseDouble(noKids.getText().toString()); } 
 private void calculate() { try{ etKids = Double.parseDouble(noKids.getText().toString()); etGumballs = Double.parseDouble(noGumballs.getText().toString()); tvSumIn = etGumballs / etKids; }catch(exception e) { e.printStackTrace(): } String thisIsIt = new Double(tvSumIn).toString(); if(tvSumIn < 2){ noSum.setText(thisIsIt + " This is it "); }else{ noSum.setText("This is else"); } } 

Esta es una pregunta de Java, no una pregunta de Android.

Debe manejar la excepción NumberFormat en su código. ¿Qué sucede si alguien entra "abc" en el cuadro de texto? ¿Qué quieres que haga tu aplicación? Usted maneja las excepciones usando bloques try / catch: http://tutorials.jenkov.com/java-exception-handling/basic-try-catch-finally.html

También puede comprobar si noKids.getText (). ToString () está vacío antes de intentar convertirlo. Puede tener sentido que haya una respuesta diferente al usuario si la cadena es "vs" si la cadena es "abc".

Otra mejora:

 String thisIsIt = new Double(tvSumIn).toString(); if(tvSumIn < 2){ noSum.setText(thisIsIt + " This is it "); }else{ noSum.setText("This is else"); } 

podría ser:

 if(tvSumIn < 2){ noSum.setText(tvSumIn + " This is it "); }else{ noSum.setText("This is else"); } 

Entonces usted no tiene que crear una cadena inútil

Creo que la mejor manera de comprobar si el valor es correcto es la siguiente:

  noKidsStr = noKids.getText().toString(); try { etKids = Double.parseDouble(noKids.getText().toString()); } catch (NumberFormatException e) { //Here request a valid value Toast.makeText(getBaseContext(), "value is not valid", Toast.LENGTH_LONG).show(); noKids.requestFocus(); return; //Or you can add a value } } 

Creo que este método es más elegante y tiene en cuenta cualquier tipo de entrada que añadir. BR, Adrian.

Pruebe este código TextView_object.setText (new Double (sum) .toString ());

Ampliando el puesto de Vladmir (no puedo agregar un comentario a ese específico)

usted puede tener una mano corta de que el uso de las siguientes dos líneas en lugar del bloque if / else (? es el equivalente de if / else, cuando se utiliza en determinadas situaciones)

 noKidsStr = noKids.getText().toString(); etKids = (noKidsStr == null || noKidsStr.isEmpty())?0.0:Double.parseDouble(noKids.getText().toString()); 
  • Problema al guardar las preferencias compartidas en Android
  • No se puede ver el contenido de la variable final dentro de la clase anónima al depurar en Eclipse una aplicación para Android
  • ¿WebView saveState () preserva variables / entorno de JavaScript?
  • ¿Hay alguna manera de comprobar si una variable está definida en Java?
  • Declaración de variables de botón como una matriz con un bucle for android
  • Public static variable o use putExtra método de clase de intención
  • Gradle buildConfigField con una variable entera
  • ¿Necesito restaurar todas las variables onResume?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.