You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.progressBar
  • R.id.editText_register_full_name
  • R.id.radio_group_register_gender
  • R.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,提问作者שלינוי רבינוביץ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:00:55