Ошибка java.lang.NumberFormatException: для входной строки сбой программы

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

2019-04-21 10:03:27.179 4338-4338/com.example.mymedicare E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.mymedicare, PID: 4338
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mymedicare/com.example.mymedicare.enteringReadings}: java.lang.NumberFormatException: For input string: ""
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.NumberFormatException: For input string: ""
        at java.lang.Integer.parseInt(Integer.java:620)
        at java.lang.Integer.parseInt(Integer.java:643)
        at com.example.mymedicare.enteringReadings.onCreate(enteringReadings.java:28)
        at android.app.Activity.performCreate(Activity.java:6975)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770
public class enteringReadings extends AppCompatActivity {

private MyDBHelper db;
//declares values
private Button Enter;
private EditText Temprature;
private EditText lowerBlood;
private EditText higherBlood;
private EditText heartBeat;


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

    //Reads values as integers
    Temprature = findViewById(R.id.Temprature);
    int temprature =Integer.parseInt( Temprature.getText().toString());
    lowerBlood = findViewById(R.id.lowerBlood);
    int Lowerblood =Integer.parseInt( lowerBlood.getText().toString());
    higherBlood = findViewById(R.id.higherBlood);
    int Higherblood =Integer.parseInt( higherBlood.getText().toString());
    heartBeat = findViewById(R.id.heartBeat);
    int Heartbeat =Integer.parseInt( heartBeat.getText().toString());

    Button Enter = findViewById(R.id.Enter);
    db = new MyDBHelper(this);

    Enter.setOnClickListener((View.OnClickListener) this);

    if (temprature <= 37 && Lowerblood <=80 && Higherblood <=120 && Heartbeat <= 72 );
    Toast.makeText(getApplicationContext(),"Your readings are fine no action required",Toast.LENGTH_LONG);
}
}

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

Виновником является одна из этих строк, содержащих Integer.parseInt.

lealceldeiro 21.04.2019 11:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
4 654
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Temprature.getText() возвращает пустую строку. Пустая строка не может быть приведена к Integer. Добавьте блок try-catch в свой код для обработки NumberFormatException.

int temprature = 0;
try {
    temprature = Integer.parseInt(Temprature.getText().toString());
} catch (NumberFormatException e) {
   // Log error, change value of temperature, or do nothing
}

Я попробовал это, и все равно выдает ту же ошибку, есть ли способ реализовать это, используя текст редактирования в виде числа?

BradleighJL 21.04.2019 12:01

@BradleighJL Вы должны добавить блок try-catch для каждого метода Integer.parseInt.

Andrew Churilo 21.04.2019 12:36

Пробовал это раньше и получил эту ошибку: java.lang.RuntimeException: невозможно запустить активность нельзя привести к android.view.View$OnClickListener

BradleighJL 21.04.2019 12:49

@BradleighJL Это еще один сбой. Ваша активность не реализует интерфейс OnClickListener.

Andrew Churilo 21.04.2019 13:33

Как вы видете :

ComponentInfo{com.example.mymedicare/com.example.mymedicare.enteringReadings}: java.lang.NumberFormatException: For input string: ""

Он говорит, что вы пытаетесь преобразовать пустую строку, например, вы должны указать значение для вашего int при запуске.

Temprature = findViewById(R.id.Temprature);
    int temprature = 0;
    temprature =Integer.parseInt( Temprature.getText().toString());

Таким образом, даже если editText будет пустым, система передаст 0.

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

if (!Temprature.getText().toString().equals(""){
        temprature =Integer.parseInt( Temprature.getText().toString());

}else{
        Toast.makeText(context,"Please, select a value", 
            Toast.LENGTH_SHORT).show();
}

Спасибо за ответ, да, я хочу передать значение только тогда, когда пользователь вводит его, а затем нажимает кнопку, поэтому я попытаюсь реализовать это сейчас и дам вам знать, как я продвигаюсь, было бы проще изменить тексты редактирования на число ?

BradleighJL 21.04.2019 11:33

Было бы лучше, но не забудьте проверить, есть ли оценщик или нет с помощью if, иначе программа снова передаст нулевое значение, вы можете проверить это, выполнив такую ​​​​вещь: if ( int != null){temprature = ecc...} счастливой пасхи и счастливого программирования, чувак, кстати :)

Saltae 21.04.2019 12:26

Спасибо большое и вас тоже с Пасхой :)

BradleighJL 21.04.2019 12:33

Где именно я бы это реализовал?

BradleighJL 21.04.2019 12:36

Поэкспериментируйте с длиной значения, например: if (Temprature.getText().length() != 0) { // Сделайте что-нибудь}. Это исключит любые пустые значения!

Saltae 21.04.2019 12:43

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

public class enteringReadings extends AppCompatActivity {

private MyDBHelper db;
//declares values
private Button Enter;
private EditText Temprature;
private EditText lowerBlood;
private EditText higherBlood;
private EditText heartBeat;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_entering_readings);
    Temprature = findViewById(R.id.Temprature);
    lowerBlood = findViewById(R.id.lowerBlood);
    higherBlood = findViewById(R.id.higherBlood);
    heartBeat = findViewById(R.id.heartBeat);

    //Reads values as integers


    Button Enter = findViewById(R.id.Enter);
    db = new MyDBHelper(this);

    //Enter.setOnClickListener((View.OnClickListener) this);
    Enter.setOnClickListener(new Button.OnClickListener() {
        @Override
        public void onClick(View v) {
            int temprature = 0;
            try {
                temprature = Integer.parseInt(Temprature.getText().toString());
            } catch (NumberFormatException e) {
                // Log error, change value of temperature, or do nothing
            }

            int Lowerblood = 0;
            try {
                Lowerblood = Integer.parseInt(lowerBlood.getText().toString());
            } catch (NumberFormatException e) {
                // Log error, change value of lowerBlood, or do nothing
            }

            int Higherblood = 0;
            try {
                Higherblood = Integer.parseInt(higherBlood.getText().toString());
            } catch (NumberFormatException e) {
                // Log error, change value of higherBlood, or do nothing
            }

            int Heartbeat = 0;
            try {
                Heartbeat = Integer.parseInt(heartBeat.getText().toString());
            } catch (NumberFormatException e) {
                // Log error, change value of heartBeat, or do nothing
            }
            if (temprature <= 37 && Lowerblood <= 80 && Higherblood <= 120 && Heartbeat <= 72) ;
            Toast.makeText(getApplicationContext(), "Your readings are fine no action required", Toast.LENGTH_LONG).show();


        }

    });
}

}

Вот как у меня это заработало, в конце концов я приму ответ от @Andrew Churilo, поскольку это то, что я использовал, но оно нуждалось в небольшом редактировании. Спасибо всем за ответы, всем большое спасибо и счастливой Пасхи

BradleighJL 21.04.2019 13:18

Другие вопросы по теме

Похожие вопросы

Как создать аналог стандартного метода функционального интерфейса Java в TypeScript?
Разделить с помощью регулярного выражения в java, в результате чего получится пустой элемент
Использование библиотеки Arrays для сортировки слиянием массива int
Как решить проблему «ошибка: неверные типы операндов для бинарного оператора»?
Не удалось написать JSON: (было java.lang.NullPointerException); вложенным исключением является com.fasterxml.jackson.databind.JsonMappingException
Как исправить управление макетом
Я пытаюсь maven установить репозиторий apache-storm, который я клонировал. И получаю следующую ошибку. Как это решить?
Как методы Java 8 по умолчанию помогают с лямбда-выражениями?
Элемент Enforce из карты, используемой потоком, не должен использоваться другим потоком, пока первый поток не завершит выполнение
Как выполнить группировку, подсчет и суммирование из списка объектов в одном потоке и сохранить в другом списке объектов?