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

Android应用启动崩溃:调用FirebaseUser.getUid()空指针异常如何解决

崩溃原因

你的应用崩溃是由空指针异常导致的,崩溃日志明确指向ShopMenu.java第80行:调用FirebaseUser.getUid()时,FirebaseUser对象为null。
FirebaseAuth.getInstance().getCurrentUser()会在以下场景返回null:

  • 当前没有处于有效登录状态的用户
  • Firebase Auth 还未完成初始化就提前调用了该方法
  • 之前的登录凭证已过期失效
修复方案

1. 基础修复(最简方案)

在获取FirebaseUser后增加空判断,为空时直接跳转登录页,避免后续调用空对象方法:

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

    mAuth = FirebaseAuth.getInstance();
    user = FirebaseAuth.getInstance().getCurrentUser();
    // 新增空判断
    if (user == null) {
        // 替换为你自己的登录Activity类名
        startActivity(new Intent(ShopMenu.this, LoginActivity.class));
        finish();
        return;
    }
    reference = FirebaseDatabase.getInstance().getReference("users");
    userID = user.getUid();
    final TextView guestUser = (TextView) findViewById(R.id.guest_User);

    reference.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            UserModel userProfile = snapshot.getValue(UserModel.class);
            if (userProfile != null){
                String fullName = userProfile.getName();
                guestUser.setText(fullName);
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Toast.makeText(ShopMenu.this, "Error: Something Happen", Toast.LENGTH_SHORT).show();
        }
    });
}

2. 优化方案(推荐)

使用AuthStateListener监听登录状态,避免Firebase初始化延迟导致的误判,兼容性更好:

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

    mAuth = FirebaseAuth.getInstance();
    reference = FirebaseDatabase.getInstance().getReference("users");
    final TextView guestUser = (TextView) findViewById(R.id.guest_User);

    // 注册登录状态监听
    mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser currentUser = firebaseAuth.getCurrentUser();
            if (currentUser == null) {
                startActivity(new Intent(ShopMenu.this, LoginActivity.class));
                finish();
                return;
            }
            String userID = currentUser.getUid();
            reference.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    UserModel userProfile = snapshot.getValue(UserModel.class);
                    if (userProfile != null){
                        guestUser.setText(userProfile.getName());
                    }
                }
                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                    Toast.makeText(ShopMenu.this, "Error: Something Happen", Toast.LENGTH_SHORT).show();
                }
            });
        }
    });
}
额外注意

请确认你应用的启动页不是ShopMenu,如果需要将该页面设为启动页,必须保留上述空判断或者登录状态监听逻辑,避免未登录用户直接进入页面触发崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:54:00