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

安卓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();
                }
            }
        });
    }
}

关键修改说明

  1. 注册成功判断:新增task.isSuccessful()判断,只有注册成功才执行后续的Firestore写入操作
  2. 安全获取用户对象:通过task.getResult().getUser()获取注册成功后的用户实例,比直接调用mAuth.getCurrentUser()更可靠,避免状态同步问题
  3. 修复输入验证逻辑:将&&改为||,确保任意字段为空时都提示用户补全
  4. 移除敏感数据存储:删除了将密码写入Firestore的代码,密码属于敏感信息,Firebase Auth已经负责存储和验证,无需额外存储
  5. 错误信息优化:失败时显示具体错误原因,方便调试(比如“邮箱已被注册”“密码长度不足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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:43:19