尽管Firebase参考可以,但出现null错误-

时间:2018-11-30 00:47:07

标签: java android firebase android-studio nullpointerexception

当我的代码到达valueEventListener时,我得到java.lang.NullPointerException: Can't pass null for argument 'pathString' in child(),尽管在调试时,子级值不为null。

这是代码的图像:

code image

这是数据库的样子:

database image

通过完全删除代码并重新开始解决了该问题。这次,我检查了Firebase github,并这样做了(几乎是同一回事?我希望我知道我的第一个代码出了什么问题):

userReference = FirebaseDatabase.getInstance().getReference().child("users").child(uid);
ValueEventListener userListener = new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        //Get user object
        currentUser = dataSnapshot.getValue(User.class);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        // [START_EXCLUDE]
        Toast.makeText(UserAreaActivity.this, "Failed to load post.",
                Toast.LENGTH_SHORT).show();
    }
};
userReference.addValueEventListener(userListener);

4 个答案:

答案 0 :(得分:1)

在显示的代码中,唯一可以获得带有该消息的NPE的位置是在呼叫中:

...child("users").child(uid);

因此,我将检查该uid变量,找出解决这种情况(uid == null)的方法。

答案 1 :(得分:0)

使用getValue(String.class)代替getValue().toString();

答案 2 :(得分:0)

您正在使用不必要的for循环。您已经知道什么是用户uid。删除for循环,然后重试。

答案 3 :(得分:0)

只需使用以下代码:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String country = dataSnapshot.child("country").getValue(String.class);
        String city = dataSnapshot.child("city").getValue(String.class);
        Log.d(TAG, country + " / " + city);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

logcat中的输出将与用户的countrycity完全相同。