如何修复Unboxing可能会产生带有firebase的nullPointer异常?

时间:2018-03-18 19:13:58

标签: javascript java android firebase firebase-realtime-database

enter image description here无论我以哪个用户身份登录为"积分"变量总是返回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) {

        }
    });

1 个答案:

答案 0 :(得分:2)

我认为这是您正在讨论的内容,points属于某种原始类型,例如intlong

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 = ???
}