Обрабатывать исключение Blanked EditText и EditText With Character? (Лучше получить в описании) - PullRequest
0 голосов
/ 09 сентября 2018

Я создал приложение для конвертации валюты из доллара в рупии. Когда я ввел сумму в долларах, она конвертируется в рупии после нажатия button. Тип полученной суммы Variable равен double. Теперь, если я ввел character в EditText вместо Number и нажал button, приложение потерпело крах. То же самое происходит, когда я оставляю EditText пустым и нажимаю button. Очевидно, что мы не можем конвертировать персонажа в double т.е. в рупии. Теперь, как справиться с этими Run Time Errors, сохраняя приложение не получая сбой. Я пытался найти похожий вопрос, но не удовлетворился этим. (Спросите у меня дополнительную информацию относительно вопроса, если вам нужно).

ActivityMain.java

           package com.example.admin.convertcurrency;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.Toast;
import java.util.InputMismatchException;

public class MainActivity extends AppCompatActivity {

    public void ButtonClicked(View view) {



            EditText EnteredAmount = (EditText) findViewById(R.id.EnteredAmount);


            Log.i("Amount Entered", EnteredAmount.getText().toString());

            Double ConvertedAmount = (Double.parseDouble(EnteredAmount.getText().toString()));
            Double Rupees = ConvertedAmount * 71.64;


            Log.i("Converted Amount", String.valueOf(Rupees));


            Toast.makeText(MainActivity.this, String.format("%.2f",Rupees) + "Rs", Toast.LENGTH_SHORT).show();



        Toast.makeText(MainActivity.this, "Please Enter The Number Instead..!", Toast.LENGTH_SHORT).show();

    }

Журнал ошибок LogCat (после ввода одиночного символа «A» в EditText)

09-09 20:30:54.415 30894-30894/com.example.admin.convertcurrency E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.admin.convertcurrency, PID: 30894
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
        at android.view.View.performClick(View.java:5215)
        at android.view.View$PerformClick.run(View.java:21196)
        at android.os.Handler.handleCallback(Handler.java:742)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5603)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
        at android.view.View.performClick(View.java:5215) 
        at android.view.View$PerformClick.run(View.java:21196) 
        at android.os.Handler.handleCallback(Handler.java:742) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:157) 
        at android.app.ActivityThread.main(ActivityThread.java:5603) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652) 
     Caused by: java.lang.NumberFormatException: Invalid double: "a"
        at java.lang.StringToReal.invalidReal(StringToReal.java:63)
        at java.lang.StringToReal.initialParse(StringToReal.java:164)
        at java.lang.StringToReal.parseDouble(StringToReal.java:282)
        at java.lang.Double.parseDouble(Double.java:301)
        at com.example.admin.convertcurrency.MainActivity.ButtonClicked(MainActivity.java:44)
        at java.lang.reflect.Method.invoke(Native Method) 
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384) 
        at android.view.View.performClick(View.java:5215) 
        at android.view.View$PerformClick.run(View.java:21196) 
        at android.os.Handler.handleCallback(Handler.java:742) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:157) 
        at android.app.ActivityThread.main(ActivityThread.java:5603) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652) 

1021 *

LogCat Error Log (После того как EditText остался пустым)

 09-09 19:00:44.031 8951-8951/com.example.admin.convertcurrency E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.admin.convertcurrency, PID: 8951
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
        at android.view.View.performClick(View.java:5215)
        at android.view.View$PerformClick.run(View.java:21196)
        at android.os.Handler.handleCallback(Handler.java:742)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5603)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
        at android.view.View.performClick(View.java:5215) 
        at android.view.View$PerformClick.run(View.java:21196) 
        at android.os.Handler.handleCallback(Handler.java:742) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:157) 
        at android.app.ActivityThread.main(ActivityThread.java:5603) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652) 
     Caused by: java.lang.NumberFormatException: Invalid double: ""
        at java.lang.StringToReal.invalidReal(StringToReal.java:63)
        at java.lang.StringToReal.parseDouble(StringToReal.java:267)
        at java.lang.Double.parseDouble(Double.java:301)
        at com.example.admin.convertcurrency.MainActivity.ButtonClicked(MainActivity.java:23)
        at java.lang.reflect.Method.invoke(Native Method) 
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384) 
        at android.view.View.performClick(View.java:5215) 
        at android.view.View$PerformClick.run(View.java:21196) 
        at android.os.Handler.handleCallback(Handler.java:742) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:157) 
        at android.app.ActivityThread.main(ActivityThread.java:5603) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

1 - вам нужно заставить клавиатуру быть только числовой, и это можно сделать, используя inputType в вас EditText XML :

android:inputType="numberDecimal"

2 - вам нужно обработать случай пустой строки (пустой ввод)

if(EnteredAmount.getText().toString().isEmpty()){
    Toast.makeText(MainActivity.this, "you must enter a value to converted",
                   Toast.LENGTH_SHORT).show();
}

3 - чтобы убедиться, что пользователь не скопирует символ в EditText, вы можете создать простой метод для этого:

private boolean containsChar(String input){
   return input.contains("A-Za-z ");
   // you can add any special chars need to avoid after A-Za-z for example A-Za-z+-*/
}

так что ваш финальный клик может быть таким

String s = EnteredAmount.getText().toString();
if(s.isEmpty()){
    Toast.makeText(MainActivity.this, "you must enter a value to converted",
                   Toast.LENGTH_SHORT).show();
}else if(containsChar(s)){
    Toast.makeText(MainActivity.this, "can't contain chars",
                   Toast.LENGTH_SHORT).show();
}else{
   // do operation here
}
0 голосов
/ 09 сентября 2018

Чтобы запретить ввод в ввод чего-либо, кроме десятичных чисел, добавьте следующее свойство в ваш текст редактирования в XML:

android:inputType="numberDecimal"

Чтобы предотвратить сбой приложения во время преобразования, проверьте, не превышает ли длина ввода значение 0:

String enteredAmount = EnteredAmount.getText().toString();
if (enteredAmount.length > 0) {
    Double ConvertedAmount = (Double.parseDouble(EnteredAmount.getText().toString()));
    Double Rupees = ConvertedAmount * 71.64;


    Log.i("Converted Amount", String.valueOf(Rupees));


    Toast.makeText(MainActivity.this, String.format("%.2f",Rupees) + "Rs", Toast.LENGTH_SHORT).show();
} else {
    //do nothing or notify the user that the input can't be empty"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...