Android应用点击注册按钮崩溃无错误提示,求排查(附相关代码)
Android注册页面跳转崩溃排查
我开发的带登录注册功能的Android应用,点击MainActivity的注册按钮跳转至RegisterActivity时崩溃,提示“app keeps stopping”,无具体错误信息,已确认AndroidManifest.xml配置正确。相关代码如下:
MainActivity代码
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Set the title getSupportActionBar().setTitle("Firebase App"); /* //Open login activity Button buttonLogin = findViewById(R.id.button_login); buttonLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this ,LoginActivity.class ); startActivity(intent); } }); */ //Open Register Activity Button buttonRegister = findViewById(R.id.button_register); buttonRegister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this ,RegisterActivity.class ); startActivity(intent); } }); } }
RegisterActivity代码
public class RegisterActivity extends AppCompatActivity { private EditText editTextRegisterFullName , editTextRegisterEmail , editTextRegisterDoB , editTextRegisterMobile , editTextRegisterPwd , editTextRegisterConfirmPwd; private ProgressBar progressBar; private RadioGroup radioGroupRegisterGander; private RadioButton radioButtonRegisterGanderSelected; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); getSupportActionBar().setTitle("Register"); Toast.makeText(RegisterActivity.this,"You can register now",Toast.LENGTH_LONG).show(); progressBar = findViewById(R.id.progressBar); editTextRegisterFullName = findViewById(R.id.editText_register_full_name); editTextRegisterEmail = findViewById(R.id.editText_register_email); editTextRegisterDoB = findViewById(R.id.editText_register_dob); editTextRegisterMobile = findViewById(R.id.editText_register_mobile); editTextRegisterPwd = findViewById(R.id.editText_register_password); editTextRegisterConfirmPwd= findViewById(R.id.editText_register_confirm_password); //RadioButton for Gander radioGroupRegisterGander = findViewById(R.id.radio_group_register_gender); radioGroupRegisterGander.clearCheck(); Button buttonRegister = findViewById(R.id.button_register); buttonRegister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int selectedGanderId = radioGroupRegisterGander.getCheckedRadioButtonId(); radioButtonRegisterGanderSelected = findViewById(selectedGanderId); //Obtain the entered data (EditText to string) String textFullName = editTextRegisterFullName.getText().toString(); String textEmail = editTextRegisterEmail.getText().toString(); String textDoB = editTextRegisterDoB.getText().toString(); String textMobile = editTextRegisterMobile.getText().toString(); String textPwd = editTextRegisterPwd.getText().toString(); String textConfirmPwd = editTextRegisterConfirmPwd.getText().toString(); String textGander; //Can't obtain yet // Empty check if (TextUtils.isEmpty(textFullName)) { Toast.makeText(RegisterActivity.this, "please enter your full name", Toast.LENGTH_LONG).show(); editTextRegisterFullName.setError("Full Name is required"); editTextRegisterFullName.requestFocus(); } else if (TextUtils.isEmpty(textEmail)) { Toast.makeText(RegisterActivity.this, "please enter your Email", Toast.LENGTH_LONG).show(); editTextRegisterEmail.setError("Email is required"); editTextRegisterEmail.requestFocus(); } else if (!Patterns.EMAIL_ADDRESS.matcher(textEmail).matches()) { Toast.makeText(RegisterActivity.this, "please re-enter your Email", Toast.LENGTH_LONG).show(); editTextRegisterEmail.setError("Valid Email is required"); editTextRegisterEmail.requestFocus(); } else if (TextUtils.isEmpty(textDoB)) { Toast.makeText(RegisterActivity.this, "please enter your Date of Birth", Toast.LENGTH_LONG).show(); editTextRegisterDoB.setError("Date of Birth is required"); editTextRegisterDoB.requestFocus(); } else if (radioGroupRegisterGander.getCheckedRadioButtonId() == -1) { Toast.makeText(RegisterActivity.this, "Pleas select your gender", Toast.LENGTH_LONG).show(); radioButtonRegisterGanderSelected.setError("Gender is required"); radioButtonRegisterGanderSelected.requestFocus(); } else if (TextUtils.isEmpty(textMobile)) { Toast.makeText(RegisterActivity.this, "please enter your mobile no.", Toast.LENGTH_LONG).show(); editTextRegisterMobile.setError("Mobile No. is required"); editTextRegisterMobile.requestFocus(); } else if (textMobile.length() != 10) { Toast.makeText(RegisterActivity.this, "please re-enter your mobile no.", Toast.LENGTH_LONG).show(); editTextRegisterMobile.setError("Mobile No. should be 10 digits"); editTextRegisterMobile.requestFocus(); } else if (TextUtils.isEmpty(textPwd)) { Toast.makeText(RegisterActivity.this, "please enter your Password", Toast.LENGTH_LONG).show(); editTextRegisterPwd.setError("Password is required"); editTextRegisterPwd.requestFocus(); } else if (textPwd.length() < 6) { Toast.makeText(RegisterActivity.this, "Password should be at least 6 digits", Toast.LENGTH_LONG).show(); editTextRegisterPwd.setError("Password too weak"); editTextRegisterPwd.requestFocus(); } else if (TextUtils.isEmpty(textConfirmPwd)) { Toast.makeText(RegisterActivity.this, "please confirm your Password", Toast.LENGTH_LONG).show(); editTextRegisterConfirmPwd.setError("Password confirmation is required"); editTextRegisterConfirmPwd.requestFocus(); } else if (!textPwd.equals(textConfirmPwd)) { Toast.makeText(RegisterActivity.this, "Pleas enter the same password", Toast.LENGTH_LONG).show(); editTextRegisterConfirmPwd.setError("Password confirmation is required "); editTextRegisterConfirmPwd.requestFocus(); //Clear the entered passwords editTextRegisterPwd.clearComposingText(); editTextRegisterConfirmPwd.clearComposingText(); } else { textGander = radioButtonRegisterGanderSelected.getText().toString(); progressBar.setVisibility(View.VISIBLE); registerUser(textFullName,textEmail,textDoB,textGander,textMobile,textPwd); } } }); } //Register User using the credentials given private void registerUser(String textFullName, String textEmail, String textDoB, String textGander, String textMobile, String textPwd) { FirebaseAuth auth = FirebaseAuth.getInstance(); auth.createUserWithEmailAndPassword(textEmail , textPwd).addOnCompleteListener(RegisterActivity.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()){ Toast.makeText(RegisterActivity.this, "User registered successfully",Toast.LENGTH_LONG).show(); FirebaseUser firebaseUser =auth.getCurrentUser(); //send Verification Email firebaseUser.sendEmailVerification(); /*//open profile after successful registration Intent intent = new Intent(RegisterActivity.this,UserProfilActivity.class); //to prevent user from returning back to register activity on pressing back button after registration intent.setFlags(intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); // to close Register Activity*/ } } }); } }
崩溃原因排查及修复
1. 空指针异常(核心问题)
在RegisterActivity的按钮点击事件中,先执行了:
int selectedGanderId = radioGroupRegisterGander.getCheckedRadioButtonId(); radioButtonRegisterGanderSelected = findViewById(selectedGanderId);
当用户未选择性别时,selectedGanderId为-1,findViewById(-1)返回null。后续在性别未选择的判断分支中调用radioButtonRegisterGanderSelected.setError(),直接触发空指针异常导致崩溃。
修复方案:
将获取选中RadioButton的代码移到性别已选择的分支中,避免操作null对象:
// 移除开头的radioButtonRegisterGanderSelected = findViewById(selectedGanderId); // 修改性别未选择的判断分支: else if (radioGroupRegisterGander.getCheckedRadioButtonId() == -1) { Toast.makeText(RegisterActivity.this, "Please select your gender", Toast.LENGTH_LONG).show(); // 直接提示用户选择,无需操作null的RadioButton } // 在最后else分支中再获取选中的RadioButton: else { int selectedGanderId = radioGroupRegisterGander.getCheckedRadioButtonId(); radioButtonRegisterGanderSelected = findViewById(selectedGanderId); textGander = radioButtonRegisterGanderSelected.getText().toString(); progressBar.setVisibility(View.VISIBLE); registerUser(textFullName,textEmail,textDoB,textGander,textMobile,textPwd); }
2. 布局控件ID不匹配
检查activity_register.xml中以下控件ID是否与代码完全一致:
R.id.progressBarR.id.editText_register_full_nameR.id.radio_group_register_genderR.id.button_register
若布局中无对应ID,findViewById返回null,后续调用控件方法也会触发空指针崩溃。
3. Firebase依赖配置问题
确认Module级别build.gradle已添加正确的Firebase Auth依赖:
implementation 'com.google.firebase:firebase-auth:22.3.1' // 可根据最新版本调整
同时确保google-services.json已正确放置在app目录下。
4. 未处理注册失败场景
在registerUser方法中仅处理了注册成功的情况,建议添加失败回调,避免异常扩散:
auth.createUserWithEmailAndPassword(textEmail , textPwd).addOnCompleteListener(RegisterActivity.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { progressBar.setVisibility(View.GONE); // 隐藏进度条 if (task.isSuccessful()){ Toast.makeText(RegisterActivity.this, "User registered successfully",Toast.LENGTH_LONG).show(); FirebaseUser firebaseUser =auth.getCurrentUser(); firebaseUser.sendEmailVerification(); } else { Toast.makeText(RegisterActivity.this, "Registration failed: " + task.getException().getMessage(), Toast.LENGTH_LONG).show(); } } });
内容的提问来源于stack exchange,提问作者שלינוי רבינוביץ
相关产品推荐
相关产品推荐

