无论我以哪个用户身份登录为"积分"变量总是返回0.相同的代码适用于不同的活动,我看不出有什么不同。当我将鼠标悬停在数据快照上时,表示可能会产生空指针异常,但它也会对其他有效的活动说明这一点。我花了很多时间试图解决这个问题。感谢。
databaseUsers =FirebaseDatabase.getInstance().getReference("Users");
final FirebaseAuth firebaseAuth;
firebaseAuth = FirebaseAuth.getInstance();
user = firebaseAuth.getCurrentUser();
databaseUsers.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
points = dataSnapshot.child(user.getUid()).child("points").getValue(int.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//Getting Total Points from Firebase Database
databaseUsers.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
totalpoints = dataSnapshot.child(user.getUid()).child("totalpoints").getValue(int.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 0 :(得分:2)
我认为这是您正在讨论的内容,points
属于某种原始类型,例如int
或long
:
points = dataSnapshot.child(user.getUid()).child("points").getValue(int.class);
此处的问题是.getValue(Class<T>)
会返回一个盒装类型,例如Integer
,当数据点不存在时,可能是null
。如果您尝试将返回的值分配给基本类型,则需要取消装箱值,并且取消装箱null
值会导致空指针异常。
要保护null
值,您需要添加null
- 检查:
Integer value = dataSnapshot.child(user.getUid()).child("points").getValue(int.class);
if (value != null) {
points = value;
} else {
// TODO
// points = ???
}