Получение исключения NumberFormatException из числового поля EditText

Я пытаюсь создать цикл for для добавления представлений в макет. Цикл for работает нормально (я пробовал его с инициализированными переменными), но мне нужно получить целое число из EditText. Я использовал try-catch, и LogCat сообщает мне следующее...

java.lang.NumberFormatException: invalid int "".

На веб-сайте developments.android.com говорится, что это связано с неправильным преобразованием строки в целое число, но я не понимаю, как я мог неправильно получать данные из файла EditText.

Это мой код...

public class UserPref2Activity extends Activity 

{
@Override

public void onCreate(Bundle savedInstanceState) 
{
    try
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        EditText numSensors = (EditText) findViewById(R.id.num_sensors);
        String change = numSensors.getText().toString();
        int i = Integer.parseInt(change);

        int j; //iterates through the for loop 

        ScrollView sv = new ScrollView(this);
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        sv.addView(ll);

        for(j=1;j<i;j++)
        {
            EditText name = new EditText(this);
            name.setText("Name:");
            EditText type = new EditText(this);
            type.setText("Type:");
            EditText bits = new EditText(this);
            bits.setText("Bits:");
            ll.addView(name);
            ll.addView(type);
            ll.addView(bits);
        } 
        this.setContentView(sv);
    }
    catch (Exception e)
    {
        //sends actual error message to the log
        Log.e("ERROR", "ERROR IN CODE:" + e.toString());
        //prints out location of error
        e.printStackTrace();
    }
  }
}

А это мой XML-файл...

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" 
android:id="@+id/userLayout" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Enter number of sensors:" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:id="@+id/num_sensors" /> 


person TheCommander    schedule 20.06.2012    source источник
comment
какая польза от я? когда он никогда не будет отображаться на экране?   -  person Dheeresh Singh    schedule 20.06.2012


Ответы (7)


Ваш EditText изначально имеет пустое значение String (т.е. ""). Это, очевидно, не число, поэтому, когда вы пытаетесь позвонить int i = Integer.parseInt(change);, вы получаете сообщение об ошибке.

Есть несколько способов исправить это, но в основном это сводится либо к предотвращению ошибки путем установки начального значения, либо к обнаружению пустой строки и правильной ее обработке.

Чтобы ошибка не появлялась...

EditText numSensors = (EditText) findViewById(R.id.num_sensors);
String change = numSensors.getText().toString();
if (change.equals("")){ // detect an empty string and set it to "0" instead
    change = "0";
}
int i = Integer.parseInt(change);

Или установите начальное значение "0" для EditText, однако это также отображает значение 0 в EditText на вашем интерфейсе, а не пустое, поэтому оно может не подходить для всех целей...

<EditText android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:inputType="number"
          android:text="0"
          android:id="@+id/num_sensors" />

Если вы хотите обнаружить ошибку и правильно ее обработать, вы должны сделать это...

EditText numSensors = (EditText) findViewById(R.id.num_sensors);
String change = numSensors.getText().toString();
int i = 0; // set it to 0 as the default
try {
    i = Integer.parseInt(change);
}
catch (NumberFormatException e){}

Это в основном устанавливает значение i = 0 и меняет его на другое значение только в том случае, если код try{} не выдает ошибку.

person wattostudios    schedule 20.06.2012

Если вы попытаетесь разобрать пустую строку, она всегда будет выдавать NumberFormatException.

Измените свой код на следующий.

int i;
String change = numSensors.getText().toString();
if(change.length>0)
{
  i = Integer.parseInt(change);
}
else
{
   i=0;
}  
person Vipul    schedule 20.06.2012

Я думаю, что начальный текст редактирования будет пустым, поэтому "" (blank is not a valid input) указывает на ошибку, которую вы должны заполнить данными в тексте редактирования, а затем, щелкнув любое событие, вы должны выполнить синтаксический анализ....

person Dheeresh Singh    schedule 20.06.2012

Отредактируйте файл макета

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
android:text="0"
    android:id="@+id/num_sensors" /> 
person Community    schedule 20.06.2012

Вы получаете эту ошибку, потому что изначально в тексте редактирования нет ничего или ""/пустой строки. Нет смысла получать текст редактируемого текста, когда он все еще отображается. Возможно, вы захотите иметь кнопку или какое-либо другое событие, которое будет означать, что пользователь закончил ввод значения в текст редактирования, а затем вы можете продолжить и получить значение текста редактирования. Но всегда проверяйте пустую строку

person Arun George    schedule 20.06.2012

bez вы передаете пустую строку в parseInt(), поэтому проверьте перед разбором строки в int как:

EditText numSensors  = (EditText) findViewById(R.id.num_sensors);
String change  = numSensors.getText().toString();
if (change.trim().equals("")) {
 //DO SOMETHING HERE
}
else
{
int i = Integer.parseInt(change);
YOUR CODE HERE....
}
person ρяσѕρєя K    schedule 20.06.2012

Чтобы предотвратить получение int значения «», что происходит при втором щелчке в пустом поле EditText, вы можете добавить эту строку в свой код Java:

int i;
String change = numSensors.getText().toString();
if(!(change.equals("")))
{
  i = Integer.parseInt(change);
}
person Mitsos    schedule 15.11.2015