我一直在获取java.lang.String com.google.firebase.auth.FirebaseUser.getUid()';错误,尽管已确认他们是用户

我一直在获取java.lang.String com.google.firebase.auth.FirebaseUser.getUid()';错误,尽管已确认他们是用户,java,android,firebase,firebase-realtime-database,firebase-authentication,Java,Android,Firebase,Firebase Realtime Database,Firebase Authentication,我有相对较新的Fire Base实现。我已经做了同样的事情一遍又一遍,但现在当我使用它失败时,它仍然有效。当我试图从数据库中检索数据时出现错误。应用程序崩溃时会说nullpoint error getUid(),我将在下面发布错误。在我已经登录并验证该用户之后,会出现此错误 代码如下: import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.cont

我有相对较新的Fire Base实现。我已经做了同样的事情一遍又一遍,但现在当我使用它失败时,它仍然有效。当我试图从数据库中检索数据时出现错误。应用程序崩溃时会说nullpoint error getUid(),我将在下面发布错误。在我已经登录并验证该用户之后,会出现此错误

代码如下:


import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
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.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.HashMap;
import java.util.Objects;

import de.hdodenhof.circleimageview.CircleImageView;

public class SettingsActivity extends AppCompatActivity {

    private Button UpdateAccountSettings;
    private EditText UserName, UserStatus;
    private CircleImageView UserProfileImage;

    private FirebaseAuth mAuth;
    private FirebaseUser currentUser;

    private DatabaseReference RootRef;

    private String currentUserID;

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

        mAuth = FirebaseAuth.getInstance();
        currentUser = mAuth.getCurrentUser();
        currentUserID = currentUser.getUid();

        RootRef = FirebaseDatabase.getInstance("https://chatrcsapp-default-rtdb.firebaseio.com").getReference();

        IntializeFields();


        

        UpdateAccountSettings.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UpdateSettings();
            }
        });


        RetrieveUserInfo();

    }





    private void IntializeFields() {

        UpdateAccountSettings = findViewById(R.id.update_settings_button);
        UserName = findViewById(R.id.set_user_name);
        UserStatus = findViewById(R.id.set_profile_status);
        UserProfileImage = findViewById(R.id.profile_image);
    }

    private void UpdateSettings() {
        String setUserName = UserName.getText().toString();
        String setUserStatus = UserStatus.getText().toString();

        if(TextUtils.isEmpty(setUserName)){
            Toast.makeText(this, "Insert User Name, please...", Toast.LENGTH_SHORT).show();
        }
        if(TextUtils.isEmpty(setUserStatus)){
            Toast.makeText(this, "Insert User Status, please...", Toast.LENGTH_SHORT).show();
        }
        else {
            HashMap<String, String> profileMap = new HashMap<>();
            profileMap.put("uid", currentUserID);
            profileMap.put("name", setUserName);
            profileMap.put("status", setUserStatus);

            RootRef.child("Users").child(currentUserID).setValue(profileMap)
                    .addOnCompleteListener(task -> {
                        if (task.isSuccessful()){
                            SendUserToMainActivity();
                            Toast.makeText(SettingsActivity.this, "Details Added Successfully...", Toast.LENGTH_SHORT).show();
                        }
                        else {
                            String message = task.getException().toString();
                            Toast.makeText(SettingsActivity.this, "Error: " + message, Toast.LENGTH_SHORT).show();
                        }
                    });
        }
    }
    private void RetrieveUserInfo() {
        RootRef.child("Users").child(currentUserID)
                .addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                        if ((dataSnapshot.exists()) && (dataSnapshot.hasChild("name") && (dataSnapshot.hasChild("image")))){

                            String retrieveUserName = dataSnapshot.child("name").getValue().toString();
                            String retrieveUserStatus = dataSnapshot.child("status").getValue().toString();
                            String retrieveUserProfileImage = dataSnapshot.child("image").getValue().toString();

                            UserName.setText(retrieveUserName);
                            UserStatus.setText(retrieveUserStatus);


                        }
                        else if ((dataSnapshot.exists()) && (dataSnapshot.hasChild("name"))){

                            String retrieveUserName = dataSnapshot.child("name").getValue().toString();
                            String retrieveUserStatus = dataSnapshot.child("status").getValue().toString();

                            UserName.setText(retrieveUserName);
                            UserStatus.setText(retrieveUserStatus);
                        }
                        else{

                            UserName.setVisibility(View.VISIBLE);

                            Toast.makeText(SettingsActivity.this, "Please Update your Information...", Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
    }

    private void SendUserToMainActivity() {
        Intent mainActivity= new Intent(SettingsActivity.this, MainActivity.class);
        mainActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(mainActivity);
        finish();
    }
    private void SendUserToLoginActivity() {
        Intent loginIntent = new Intent(SettingsActivity.this, LoginActivity.class);
        loginIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(loginIntent);
        finish();
    }
    

}


错误消息非常明确:

所以不管你怎么想,在whic代码中,
currentUser
实际上是
null

currentUser = mAuth.getCurrentUser();
currentUserID = currentUser.getUid();
这很可能是因为Firebase在代码运行时尚未设置
mAuth.getCurrentUser()
。要防止出现这种情况,可以使用身份验证状态侦听器,以确保在身份验证状态更改时自动运行代码:

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

    mAuth = FirebaseAuth.getInstance();

    RootRef = FirebaseDatabase.getInstance("https://chatrcsapp-default-rtdb.firebaseio.com").getReference();

    IntializeFields();        
    UpdateAccountSettings.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            UpdateSettings();
        }
    });

    mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            currentUser = mAuth.getCurrentUser();
            currentUserID = currentUser.getUid();
            if (user != null ) {
                RetrieveUserInfo();
            } else { //user is not logged in
                ...
            }
        }
    });
};

}

您的currentUser为空,这是一种常见情况。阅读以下内容:感谢您的回复,我已经尝试过了,但应用程序确实会从主活动进入设置活动,但当我更新设置()时;它崩溃了,这意味着它不从Firebase检索数据,而是以空状态运行它的活动。我的答案集中在
设置活动。onCreate
,因为这是您问题中的堆栈跟踪。根据我的回答,特定的堆栈跟踪应该已经消失。是这样吗?如果是这样,这就回答了您在这个问题中发布的错误。其他地方的基本问题可能与我在回答中解释的问题相同:在大多数地方,您不能依赖
getCurrentUser()
返回实际用户,需要将其置于身份验证状态侦听器中。嘿@Arthur2020有何更新?
currentUser = mAuth.getCurrentUser();
currentUserID = currentUser.getUid();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);

    mAuth = FirebaseAuth.getInstance();

    RootRef = FirebaseDatabase.getInstance("https://chatrcsapp-default-rtdb.firebaseio.com").getReference();

    IntializeFields();        
    UpdateAccountSettings.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            UpdateSettings();
        }
    });

    mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            currentUser = mAuth.getCurrentUser();
            currentUserID = currentUser.getUid();
            if (user != null ) {
                RetrieveUserInfo();
            } else { //user is not logged in
                ...
            }
        }
    });
};