在尝试登录之前,我正在检查EditText
etEmail
和etPass
是否为空,但是我不知道这是否导致我的吐司消息出现问题,该消息使用火力基地task.getException().getMessage()
这是错误消息:方法调用'getMessage
'可能会产生'java.lang.NullPointerException'
我尝试将其从else语句中删除,并使其正常运行。我有一个SignUp.class
,它可以与firebase.getException().getMessage()
一起使用SignUp.class
不会检查EditText是否为空,所以这可能与问题有关。
我创建了一个根据EditText是否为空返回true或false的方法(passStr与etPass.getText().toString()
相同,但是在if语句中,第二个总是返回true或false,所以我只是这样做是为了简化操作,因为我不知道最好的方法。
public Boolean checkEmpty(){
status = false;
passStr = etPass.getText().toString();
emailStr = etEmail.getText().toString();
if((etPass.getText().toString().isEmpty() && 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
}
}
});
然后,当EditText为空时,将使用另一个else语句。
else {
progBar.setVisibility(View.INVISIBLE);
Toast.makeText(Login.this, "Please enter name and password",
Toast.LENGTH_LONG).show();
}
答案 0 :(得分:0)
您的代码似乎正确
尝试使用try/catch()
子句
答案 1 :(得分:0)
我认为错误非常明显。对getMessage()
的调用可能为null,因为task.getException()
可能返回null。
在调用getMessage()
之前,应确保任务异常不为null:
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();
}
}
作为参考,您可能还应该在制作和显示吐司之前,检查异常消息是否不为空。
答案 2 :(得分:0)
您必须对方法进行一些更改:-
这是检查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
}
}
});
}
答案 3 :(得分:0)
我已经改进了代码,非常感谢所有答案,以帮助我了解更多。
我完全摆脱了checkEmpty()
方法,选择在onClickListener中定义每个editText。
passStr = etPass.getText().toString();
emailStr = etEmail.getText().toString();
然后在if和else if语句中使用
if (**emailStr**.isEmpty())
else if (**passStr**.isEmpty())
带有“请输入密码”和“请输入电子邮件地址”的吐司消息。
注册完成后(它使用.addOnCompleteListener(task)
来检查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 Toast消息之前先检查输入字段是否为空。我意识到我对checkEmpty方法过于复杂,因为我要做的就是将每个定义为onClickListener中的字符串。我不需要编写新方法,因为我没有在其他任何地方使用它。