Android注册按钮点击触发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(); }
- 调整性别校验逻辑,移除对null的
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

