我知道过去曾有人问过这个问题。我已经尝试过几乎所有的解决方案都不适合我。抱歉再次询问。但是有人可以帮助我解决此错误。


  这是我的代码。


public class ProfileActivity extends AppCompatActivity {

TextView userEmail;
TextView userID;
TextView userGender;
TextView userName;
Button userLogout;

FirebaseAuth firebaseAuth;
FirebaseUser firebaseUser;

FirebaseDatabase firebaseDatabase;

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

    userEmail = findViewById(R.id.tvUserEmail);
    userGender = findViewById(R.id.tvGender);
    userName = findViewById(R.id.tvName);
    userID = findViewById(R.id.tvUserID);
    userLogout = findViewById(R.id.btnLogout);

    firebaseAuth = FirebaseAuth.getInstance();
    firebaseUser = firebaseAuth.getCurrentUser();


    firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference = firebaseDatabase.getReference().child(firebaseUser.getUid());

    //userEmail.setText(firebaseUser.getEmail());

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            String userEmailstr = dataSnapshot.child("email").getValue().toString();
            String userNamestr = dataSnapshot.child("name").getValue().toString();
            String userGenderstr = dataSnapshot.child("gender").getValue().toString();
            String userIDstr = dataSnapshot.child("id").getValue().toString();


            userEmail.setText(userEmailstr);
            userGender.setText(userGenderstr);
            userName.setText(userNamestr);
            userID.setText(userIDstr);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(getApplicationContext(),databaseError.getMessage(),Toast.LENGTH_SHORT).show();
        }
    });



    userLogout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FirebaseAuth.getInstance().signOut();
            Intent intent = new Intent(ProfileActivity.this, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
        }
    });
}}


错误出现在Datasnapshot字符串上。表示在空对象引用上的位置


  这是logcat


 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
    at com.example.patrick.test.ProfileActivity$1.onDataChange(ProfileActivity.java:60)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.0.5:75)
    at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.0.5:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.0.5:55)



  这是我的数据库
  java - datasnapshot中的Null Pointer异常字符串出现错误-LMLPHP

最佳答案

您正在使用什么:

.child(firebaseUser.getUid())


这意味着您要将来自Firebase身份验证过程的用户ID传递给子方法。但是,传递此ID并没有帮助,因为在您的数据库中,我看到您具有的是push()方法生成的ID,而不是FirebaseUser对象生成的ID。

因此,要解决此问题,您可以将正确的ID传递给child()方法,即-LS3X ... 6Meg,或者通过删除push()调用来更改将用户添加到数据库的方式,并使用类似以下方法:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("Accounts").child(uid).setValue(userObject);


第二种解决方案是推荐的解决方案。也请不要忘记添加参考中现在缺少的Accounts多余的孩子。

10-08 07:24
查看更多