如何修复拆箱可能会产生空点异常与火库?

enter image description here无论我登录哪个用户,因为“points”变量始终返回为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

我假设这是你正在谈论的行,并且是某种原始类型,例如或:pointsintlong

points = dataSnapshot.child(user.getUid()).child("points").getValue(int.class);

这里的问题是.getValue(Class<T>)返回一个盒装类型,例如,当数据点不存在时,它可能是。如果尝试将返回的值分配给基元类型,则需要取消对该值的装箱,并且取消装箱值会导致空指针异常。Integernullnull

要在出现值的情况下进行保护,您需要添加一个 -check:nullnull

Integer value = dataSnapshot.child(user.getUid()).child("points").getValue(int.class);
if (value != null) {
    points = value;
} else {
    // TODO
    // points = ???
}

答案 2

推荐