Предотвратить исключение nullPointerException, когда EditText пуст - PullRequest
0 голосов
/ 24 декабря 2018

Привет. Я делаю приложение для расчета средних значений с помощью пользовательского ввода из EditTexts.Когда я запускаю приложение, оно работает, но когда я оставляю поле пустым, оно генерирует исключение nullPointerException.Я знаю, что это такое и как я могу исправить их в целом.С моим кодом я думал об использовании оператора if, чтобы проверить, пустой ли он.Но я не знаю, как проверить пустое / нулевое значение с целыми числами.Может ли кто-нибудь объяснить, как лучше всего это проверить?

Любые советы и т. Д. Приветствуются!

Мой код:

final Button calculateButton = findViewById(R.id.calculateAverageButton);
calaculateButton.setOnClickListener(new  View.onClickListener() {
public void onClick(View v) { TextView averageView = findViewById(R.id.averageView);

int grade[] = {Integer.parseInt(((EditText) findViewById(R.id.grade1)).getText().toString());
int weight[] = {Integer.parseInt(((EditText)  findViewById(R.id.weight1)).getText().toString());

int weightTotal = weight[0];

int sum = grade[0] * weight[0];

int average = sum / weightTotal

String averageText = getString(R.string.average);
averageView.setText(averageText + Integer.toString(average));

Ответы [ 4 ]

0 голосов
/ 24 декабря 2018

Добро пожаловать в SO @ J.Doe

В вашем коде есть много моментов.

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

  final Button calculateButton = findViewById(R.id.calculateAverageButton);
 EditText e1 = (EditText) findViewById(R.id.grade1);
 EditText e2 = ((EditText)  findViewById(R.id.weight1);
TextView averageView = findViewById(R.id.averageView);
calaculateButton.setOnClickListener(new  View.onClickListener() {
  public void onClick(View v) {

     /** better practice for checking NullPointerException **/
 if(e1.getText() || e2.getText()){
  Log.d(TAG, "Null values");
return;
 }

String txt1 =  e1.getText().toString();
 String tx2 =  e2.getText().toString();

 boolean emptyE1 = txt1.equals("");
boolean emptyE2 = txt2.equals("");

 /** Checking for empty values **/
  if(emptyE1 || emptyE2){
Log.d(TAG, "Empty values");
return;
 }

   int grade;
 int weightTotal;

/** You have also to   ensure that the strings are numeric**/
try{
grade = new Integer(txt1);
 weightTotal = new Integer(txt1);
  }
 catch(NumberFormatException e){){
   Log.d(TAG, "Number input required");
   return;
      }

          /** Now, you are sure you have received numbers :) **/



      int sum = grade  * weight; // sum ? ;)

 int average = sum / weightTotal

    String averageText = getString(R.string.average);
   averageView.setText(averageText + Integer.toString(average));

      }
0 голосов
/ 24 декабря 2018

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

Нет такой вещи, как пустое целое число, вам нужно проверить строку из текста редактирования

String value = ((EditText) findViewById(R.id.grade1)).getText().toString();
if(value != null && value.length() > 0){
    try{
        //Since edit text gives you a string you cannot guarantee you have a number input
        int numberValue = Integer.parseInt(value);
    catch(NumberFormatException e){
        //handle exception
    }
}
0 голосов
/ 24 декабря 2018

Прежде всего, не инициируйте ваши просмотры (например, AverageView) внутри слушателя щелчка кнопки, поместите эту строку:

TextView averageView = findViewById(R.id.averageView);

, чтобы из блока прослушивателя щелчка вашей кнопки

Stringимеет функцию isEmpty (), поэтому, чтобы проверить наличие пустой строки, прежде чем начинать оценку []:

EditText grades = ((EditText) findViewById(R.id.grade1));
if (!grades.getText().toString().isEmpty())
    do your logic here
else
    show some error
0 голосов
/ 24 декабря 2018

Я бы порекомендовал этому проверить, является ли editText пустым или нет:

if(editText.length()>0){
        //there is text
    }else{
        //your code in case of empty editText
    }
...