Проверьте, пусты ли EditTexts для электронной почты и пароля, используя всплывающее сообщение firebase

#java #android #firebase #validation

# #java #Android #firebase #проверка

Вопрос:

Я проверяю, являются ли EditText etEmail и etPass пустыми, прежде чем пытаться войти в систему, но я не знаю, вызывает ли это проблему с моим всплывающим сообщением, в котором используется firebase task.getException().getMessage()

Это сообщение об ошибке: вызов метода « getMessage может привести к 'java.lang.NullPointerException'

Я пробовал убрать это из инструкции else и переместить, это работает. У меня есть a SignUp.class , который работает по назначению с firebase.getException().getMessage() SignUp.class не проверяет, пусты ли EditTexts, так что, возможно, это как-то связано с проблемой.

Я создал метод для возврата true или false в зависимости от того, пусты EditTexts или нет (passStr такой же, как etPass.getText().toString() , но внутри оператора if 2-й всегда возвращает true или всегда false, поэтому я просто сделал это, чтобы упростить задачу, поскольку я не знал лучшего способа).

 public Boolean checkEmpty(){
    status = false;
    passStr = etPass.getText().toString();
    emailStr = etEmail.getText().toString();

   if((etPass.getText().toString().isEmpty() amp;amp; etEmail.toString().isEmpty()) ||
          (passStr.isEmpty()) || (emailStr.isEmpty()) ) {
            status = false;
    }
    else{
        status = true;
    }
    return status;
}
 

Внутри метода onCreate, который он использует

     if(checkEmpty().equals(true)) {


        firebaseAuth.signInWithEmailAndPassword(
        etEmail.getText().toString(),
        etPass.getText().toString())
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                //this starts activity if able to sign in
                if (task.isSuccessful()) {
                    Toast.makeText(Login.this, "Login Successful", 
                                Toast.LENGTH_LONG).show();
                    startActivity(new Intent(Login.this,
                                MainActivity.class));
                }
                else {
                    //if task unsuccessful it should show firebase toast messages
                    Toast.makeText(Login.this, task.getException().getMessage(),
                    Toast.LENGTH_LONG).show(); 
                      //this getMessage does not work due to error above
                }
            }

        });
 

Затем используется другой оператор else, когда EditTexts пусты.

                 else {
                    progBar.setVisibility(View.INVISIBLE);
                    Toast.makeText(Login.this, "Please enter name and password",
                            Toast.LENGTH_LONG).show();
                }
 

Ответ №1:

Я думаю, что ошибка очень понятна. Вызов getMessage() может быть нулевым, поскольку task.getException() может возвращать значение null.

Перед вызовом вы должны убедиться, что исключение задачи не равно null getMessage() :

 if (task.isSuccessful()) {
    ...
} else {
    Throwable taskException = task.getException();

    // Before invoking getMessage() on the exception,
    // we make sure the exception is not null
    if (taskException != null) {
        Toast.makeText(Login.this, taskException.getMessage(), Toast.LENGTH_LONG).show();
    }
}
 

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

Комментарии:

1. Большое вам спасибо, я потратил слишком много времени и никогда бы не справился с этим иначе. Я понимаю, что я просто предположил, что если задача не удалась, она всегда будет выдавать GetMessage() , но это чистая зависимость от сообщений firebase. Могу ли я просмотреть, какие GetMessages предоставляются? Я хотел бы знать больше, чтобы я мог видеть, когда задача выполнена неудачно, но имеет нулевое исключение задачи. Спасибо!

2. Даже если бы было исключение с сообщением для каждой неудачной задачи, компилятор не узнал бы об этом. Все, что знает компилятор, это то, что getException() иногда может возвращать null, поэтому вы всегда будете вынуждены обрабатывать этот случай.

3.Похоже, что getException() для неудачных задач никогда не будет null, поэтому вам не нужно беспокоиться о добавлении else блока.

4. Так что это меня смущает. Почему блок else не работает нормально, если задача выполнена неудачно? Но это работает , когда вы добавляете if (taskException != null) . Спасибо вам за ваше время, очень ценю.

5. Я имел в виду, что вам не нужно добавлять else блок после if (taskException != null) , потому что вы можете быть уверены, что исключение неудачной задачи никогда не будет нулевым (так сказано в документации). Дело в том, что компилятор понятия не имеет об этом. С точки зрения компилятора, метод getException() всегда может возвращать значение null, поэтому он всегда заставляет вас обрабатывать этот случай с помощью проверки null.

Ответ №2:

Ваш код кажется правильным

Попробуйте использовать try/catch() предложение

Ответ №3:

вы должны внести некоторые изменения в свои методы :-

это делается для проверки edittext пуст или нет:-

 public Boolean checkEmpty(EditText edittext) {
        if (edittext.getText().toString().isEmpty()){
            return true;
        }else{
            return false;
        }
    }
 

и это в вашем методе onCreate:-

 if(checkEmpty(etEmail)) {
            Toast.makeText(StartActivity.this, "Email is empty", Toast.LENGTH_SHORT).show();
        }else if(checkEmpty(etPass)){
            Toast.makeText(StartActivity.this, "password is empty", Toast.LENGTH_SHORT).show();
        }else {
            firebaseAuth.signInWithEmailAndPassword(
                    etEmail.getText().toString(),
                    etPass.getText().toString())
                    .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            //this starts activity if able to sign in
                            if (task.isSuccessful()) {
                                Toast.makeText(Login.this, "Login Successful",
                                        Toast.LENGTH_LONG).show();
                                startActivity(new Intent(Login.this,
                                        MainActivity.class));
                            } else {
                                //if task unsuccessful it should show firebase toast messages
                                Toast.makeText(Login.this, task.getException().getMessage(),
                                        Toast.LENGTH_LONG).show();
                                //this getMessage does not work due to error above
                            }
                        }

                    });
        }
 

Комментарии:

1. оставьте комментарий, если у вас есть какие-либо вопросы или если этот ответ поможет вам, тогда не забудьте оценить ответ

2. привет, мой ответ помогает вам или нет?

Ответ №4:

Я улучшил свой код и я очень благодарен за все ответы, которые помогут мне понять больше. Я полностью избавился от checkEmpty() метода и решил определить каждый EditText в моем OnClickListener.

 passStr = etPass.getText().toString();
emailStr = etEmail.getText().toString();
 

которое затем используется в операторах if и else if

  if (**emailStr**.isEmpty()) 
 else if (**passStr**.isEmpty())
 

с всплывающими сообщениями «пожалуйста, введите пароль» и «пожалуйста, введите адрес электронной почты».

Когда регистрация завершена ( .addOnCompleteListener(task) для проверки используется a firebaseAuth.signInWithEmailAndPassword() ), она делает это:

                             if (task.isSuccessful()) {
                            Toast.makeText(LoginActivity.this, "Login Successful", Toast.LENGTH_LONG).show();
                            startActivity(new Intent(LoginActivity.this, Home.class));
                        } else {
                            Throwable taskException = task.getException();
                            if (taskException != null) {
                                Toast.makeText(LoginActivity.this, task.getException().getMessage(),
                                        Toast.LENGTH_LONG).show();
                            }
                        }
 

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