安卓Firebase注册功能崩溃,NullPointerException问题求助
解决Firebase注册时的NullPointerException(调用FirebaseUser.getUid()空对象引用)
问题根源
崩溃的核心原因是:你在createUserWithEmailAndPassword的onComplete回调中,没有先判断注册任务是否成功,就直接调用mAuth.getCurrentUser().getUid()。onComplete会在任务结束时触发,无论注册成功还是失败——如果注册失败(比如邮箱格式非法、密码长度不足、邮箱已被注册等),mAuth.getCurrentUser()会返回null,此时调用getUid()必然抛出空指针异常。
修复后的完整代码
package com.example.aprendosiosi; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.firestore.FirebaseFirestore; import java.util.HashMap; import java.util.Map; public class RegistersActivity extends AppCompatActivity { Button btn_register; EditText name, email, password; FirebaseFirestore mFirestore; FirebaseAuth mAuth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_registers); mFirestore = FirebaseFirestore.getInstance(); mAuth = FirebaseAuth.getInstance(); name = findViewById(R.id.nombre); email = findViewById(R.id.correo); password = findViewById(R.id.contrasena); btn_register = findViewById(R.id.btn_registro); btn_register.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String nameUser = name.getText().toString().trim(); String emailUser = email.getText().toString().trim(); String passUser = password.getText().toString().trim(); // 修复:任意字段为空都提示补全 if (nameUser.isEmpty() || emailUser.isEmpty() || passUser.isEmpty()) { Toast.makeText(RegistersActivity.this, "Complete los datos", Toast.LENGTH_SHORT).show(); } else { registerUser(nameUser, emailUser, passUser); } } }); } private void registerUser(String nameUser, String emailUser, String passUser) { mAuth.createUserWithEmailAndPassword(emailUser, passUser).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { // 先判断注册是否成功 if (task.isSuccessful()) { // 从任务结果中获取用户对象,比getCurrentUser更可靠 FirebaseUser user = task.getResult().getUser(); if (user != null) { String id = user.getUid(); Map<String, Object> map = new HashMap<>(); map.put("id", id); map.put("name", nameUser); map.put("email", emailUser); // 注意:不要把密码存储到Firestore,这是严重的安全问题 // map.put("password", passUser); mFirestore.collection("user").document(id).set(map).addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void unused) { finish(); startActivity(new Intent(RegistersActivity.this, MainActivity.class)); Toast.makeText(RegistersActivity.this, "Usuario registrado", Toast.LENGTH_SHORT).show(); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(RegistersActivity.this, "Error al guardar: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } }); } } else { // 注册失败,显示具体错误信息 String errorMsg = task.getException() != null ? task.getException().getMessage() : "Error desconocido"; Toast.makeText(RegistersActivity.this, "Error al registrar: " + errorMsg, Toast.LENGTH_SHORT).show(); } } }); } }
关键修改说明
- 注册成功判断:新增
task.isSuccessful()判断,只有注册成功才执行后续的Firestore写入操作 - 安全获取用户对象:通过
task.getResult().getUser()获取注册成功后的用户实例,比直接调用mAuth.getCurrentUser()更可靠,避免状态同步问题 - 修复输入验证逻辑:将
&&改为||,确保任意字段为空时都提示用户补全 - 移除敏感数据存储:删除了将密码写入Firestore的代码,密码属于敏感信息,Firebase Auth已经负责存储和验证,无需额外存储
- 错误信息优化:失败时显示具体错误原因,方便调试(比如“邮箱已被注册”“密码长度不足6位”等)
崩溃日志对应问题解释
日志中java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference指向代码第70行:String id = mAuth.getCurrentUser().getUid();,这是因为注册任务失败时,mAuth.getCurrentUser()返回null,调用getUid()触发空指针。
内容的提问来源于stack exchange,提问作者Wilson Romero
相关产品推荐
相关产品推荐

