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

Android注册按钮点击触发NullPointerException问题解决

问题:点击注册按钮触发NullPointerException

错误日志

Process: com.example.swapno_samity, PID: 8406
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.swapno_samity/com.example.swapno_samity.MemberRegistration}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)' on a null object reference

at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)' on a null object reference
at com.example.swapno_samity.MemberRegistration.onCreate(MemberRegistration.java:40)

相关代码

MemberRegistration类的onCreate方法

public class MemberRegistration extends AppCompatActivity {

    private EditText etName, etEmail, etDob, etPhoneNumber, etAddress, etIdCard, etPenCard, etAdarCard, etAmountOfLoan, etInterest;
    private RadioGroup radioGroupGender;
    private RadioButton etGender;

    public FirebaseDatabase firebaseDatabase;
    public DatabaseReference rootReference;
    public DatabaseReference memberReference;
    String memberId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_member_registration);

        getSupportActionBar().setTitle("Registration Form");
        etName = findViewById(R.id.editText_register_full_name);
        etEmail = findViewById(R.id.editText_register_email);
        etDob = findViewById(R.id.editText_register_dob);
        etPhoneNumber = findViewById(R.id.editText_register_mobile);
        etAddress = findViewById(R.id.editText_register_adress);
        etIdCard = findViewById(R.id.editText_register_IdCard);
        etPenCard = findViewById(R.id.editText_register_PenCard);
        etAdarCard = findViewById(R.id.editText_register_AdarCard);
        etAmountOfLoan = findViewById(R.id.editText_register_AmountOfLoan);
        etInterest = findViewById(R.id.editText_register_interestOfLoan);
        radioGroupGender = findViewById(R.id.radio_group_register_gender);
        radioGroupGender.clearCheck();
        radioGroupGender.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                etGender = radioGroupGender.findViewById(checkedId);
            }
        });

        Button registerMember = findViewById(R.id.button_register);
        registerMember.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 获取输入数据
                String textName = etName.getText().toString();
                String textEmail = etEmail.getText().toString();
                String textDob = etDob.getText().toString();
                String textAdress = etAddress.getText().toString();
                String textPhoneNumber = etPhoneNumber.getText().toString();
                String textIdCard = etIdCard.getText().toString();
                String textPenCard = etPenCard.getText().toString();
                String textAdarCard = etAdarCard.getText().toString();
                String textAmount = etAmountOfLoan.getText().toString();
                String textInterest = etInterest.getText().toString();
                String textGender = etGender.getText().toString();

                if (TextUtils.isEmpty(textName)) {
                    Toast.makeText(MemberRegistration.this, "请输入全名", Toast.LENGTH_SHORT).show();
                    etName.setError("全名必填");
                    etName.requestFocus();
                }
                if (TextUtils.isEmpty(textDob)) {
                    Toast.makeText(MemberRegistration.this, "请输入出生日期", Toast.LENGTH_SHORT).show();
                    etDob.setError("出生日期必填");
                    etDob.requestFocus();
                }
                if (TextUtils.isEmpty(textAdress)) {
                    Toast.makeText(MemberRegistration.this, "请输入正确地址", Toast.LENGTH_SHORT).show();
                    etAddress.setError("地址必填");
                    etAddress.requestFocus();
                }
                if (radioGroupGender.getCheckedRadioButtonId() == -1) {
                    Toast.makeText(MemberRegistration.this, "请选择性别", Toast.LENGTH_SHORT).show();
                    etGender.setError("性别必填");
                    etGender.requestFocus();
                }
                if (TextUtils.isEmpty(textPhoneNumber)) {
                    Toast.makeText(MemberRegistration.this, "请输入手机号码", Toast.LENGTH_SHORT).show();
                    etPhoneNumber.setError("手机号码必填");
                    etPhoneNumber.requestFocus();
                }
                if (textPhoneNumber.length() != 10) {
                    Toast.makeText(MemberRegistration.this, "请重新输入手机号码", Toast.LENGTH_SHORT).show();
                    etPhoneNumber.setError("手机号码需为10位");
                    etPhoneNumber.requestFocus();
                }
                if (TextUtils.isEmpty(textAdarCard)) {
                    Toast.makeText(MemberRegistration.this, "请输入会员身份证号码", Toast.LENGTH_SHORT).show();
                    etAdarCard.setError("会员身份证号码必填");
                    etAdarCard.requestFocus();

                }
                else{
                    registerMemberUser(textName, textEmail, textDob, textGender, textAdress, textPhoneNumber, textIdCard, textPenCard, textAdarCard, textAmount, textInterest);

                }

            }
        });


    }

registerMemberUser方法

public void registerMemberUser(String textName, String textEmail, String textDob, String textGender, String textAdress, String textPhoneNumber, String textIdCard, String textPenCard, String textAdarCard, String textAmount, String textInterest) {

//      连接实时数据库
        firebaseDatabase = FirebaseDatabase.getInstance();
        rootReference = firebaseDatabase.getReference();
        memberReference = rootReference.child("Member Register Activity");
        memberId = memberReference.push().getKey();
        ReadWriteDetails readWriteDetails = new ReadWriteDetails(memberId, textName, textEmail, textDob, textGender, textAdress, textPhoneNumber, textIdCard, textPenCard, textAdarCard, textAmount, textInterest);
        memberReference.child(memberId).setValue(readWriteDetails).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                Toast.makeText(MemberRegistration.this, "注册成功", Toast.LENGTH_SHORT).show();
            }
        });
    }
}
解决方案

从错误日志和代码分析,空指针的核心原因及修复方式如下:

1. 未选择性别时etGender为空导致空指针

  • 问题点:初始化时调用radioGroupGender.clearCheck(),此时etGender未被赋值;未选择性别点击注册时,执行etGender.setError("性别必填")会直接对null对象调用方法触发空指针。同时获取textGender时,若未选择性别,etGender.getText()也会触发空指针。
  • 修复代码:
    • 调整性别校验逻辑,移除对null的etGender的操作:
      if (radioGroupGender.getCheckedRadioButtonId() == -1) {
          Toast.makeText(MemberRegistration.this, "请选择性别", Toast.LENGTH_SHORT).show();
          // 改为让单选框获取焦点,提示用户选择
          radioGroupGender.requestFocus();
      }
      
    • 安全获取性别文本,先判断是否选中:
      // 替换原有的String textGender = etGender.getText().toString();
      String textGender = "";
      if (radioGroupGender.getCheckedRadioButtonId() != -1) {
          etGender = radioGroupGender.findViewById(radioGroupGender.getCheckedRadioButtonId());
          textGender = etGender.getText().toString();
      }
      

2. Firebase数据库引用未提前初始化(针对日志中onCreate第40行的空指针)

  • 问题点:错误日志显示空指针出现在onCreate第40行的DatabaseReference.child()调用,说明rootReference或memberReference在onCreate中被使用但未初始化(当前贴出的onCreate代码未包含该操作,可能是代码不全)。
  • 修复方式:
    在onCreate方法合适位置提前初始化Firebase引用:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_member_registration);
        
        // 初始化Firebase引用
        firebaseDatabase = FirebaseDatabase.getInstance();
        rootReference = firebaseDatabase.getReference();
        
        // 其他代码...
    }
    

内容的提问来源于stack exchange,提问作者Dolonkm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:15:37