Как разобрать двойник из EditText в TextView?(Android) - PullRequest
6 голосов
/ 19 сентября 2011

Я действительно начинаю изучать Java. Когда я запускаю этот код, все работает нормально, пока я не оставляю свои поля EditText в пустом поле и нажимаю кнопку запуска. Тогда я получаю:

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)

Я думаю, что когда я пытаюсь проанализировать Double из строки, он не получает никакого значения и создает ошибку. Мне было интересно, как избежать этой ошибки и дать какое-то значение переменной, чтобы она никогда не была пустой? Спасибо за помощь!

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");
            }

        }

        });



        }
    }

Это мой файл main.xml и я предполагаю, что в манифесте нет ничего особенного.

<?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>

Ответы [ 9 ]

17 голосов
/ 19 сентября 2011

Вот JavaDoc для класса java.lang.Double, метод 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
 */

Пустые значения не считаются анализируемыми. Вот почему вы получаете это исключение.

Вы можете провести дополнительную проверку вашего кода, чтобы увидеть, пуста ли строка в редактируемом тексте noKids, и если да, вручную установить значение 0.0:

noKidsStr = noKids.getText().toString();

if(noKidsStr == null || noKidsStr.isEmpty()) {

  etKids = 0.0;

} else {

  etKids = Double.parseDouble(noKids.getText().toString());

}

Я предлагаю написать какой-нибудь вспомогательный метод, который вы сможете использовать повторно во всех подобных ситуациях в будущем.

4 голосов
/ 19 сентября 2011

Вы должны заключить операторы Double.parseDouble .. в предложение try / catch, чтобы перехватить любые NumberFormatExceptions и установить другие значения в случае их сбоя

edit:

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;
} 
2 голосов
/ 19 сентября 2011

Вы можете сделать две вещи: во-первых, разрешить только числовые данные в поле EditText.На самом деле, я вижу, вы уже сделали это.Я обычно использую android: numeric - это первое, что я видел в android: inputType.Спасибо за это.=)

Во-вторых, убедитесь, что у вас есть текст в вашем EditText с простой проверкой.

if(noKids.getText().length() > 0)
{
    etKids = Double.parseDouble(noKids.getText().toString());
}
0 голосов
/ 20 марта 2015

Расширение на пост Владмира (я не могу добавить комментарий к этому конкретному)

вы можете использовать короткую руку, используя следующие две строки вместо блока if / else (? Является эквивалентом if / else, когда используется в определенных ситуациях)

noKidsStr = noKids.getText().toString();

etKids = (noKidsStr == null || noKidsStr.isEmpty())?0.0:Double.parseDouble(noKids.getText().toString());
0 голосов
/ 22 февраля 2015

Попробуйте этот код TextView_object.setText (new Double (sum) .toString ());

0 голосов
/ 01 декабря 2012

Я думаю, что лучший способ проверить правильность значения заключается в следующем:

   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

    }
}

Я думаю, что этот метод более элегантен и учитывает любые виды ввода, которые они добавляют. BR, Адриан.

0 голосов
/ 20 сентября 2011

Еще одно улучшение:

String thisIsIt = new Double(tvSumIn).toString();

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

может быть:

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

Тогда вам не нужно создавать бесполезную строку

0 голосов
/ 19 сентября 2011
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");
            }

        }
0 голосов
/ 19 сентября 2011

Это вопрос Java, а не вопрос Android.

Вы должны обработать исключение NumberFormat в своем коде.Что произойдет, если кто-нибудь введет «abc» в текстовое поле?Что вы хотите, чтобы ваше приложение делало?Вы обрабатываете исключения, используя блоки try / catch: http://tutorials.jenkov.com/java-exception-handling/basic-try-catch-finally.html

Возможно, вы также захотите проверить, является ли noKids.getText (). ToString () пустым, прежде чем пытаться преобразовать его.Возможно, имеет смысл иметь другую обратную связь с пользователем, если строка "" и "если строка" abc ".

...