如何修复取消装箱可能会使用 firebase 产生 nullPointer 异常?

Chr*_*ebb 12 java android firebase firebase-realtime-database

在此处输入图片说明无论我登录哪个用户,“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) {

        }
    });
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 21

我假设这是您正在谈论的行,并且points是某种原始类型,例如intor long

points = dataSnapshot.child(user.getUid()).child("points").getValue(int.class);
Run Code Online (Sandbox Code Playgroud)

这里的问题是当数据点不存在时.getValue(Class<T>)返回一个装箱类型,例如Integerwhich may be null。如果尝试将返回值分配给原始类型,则需要对该值进行拆箱,拆箱会null导致空指针异常。

为了保护null值,您需要添加null-check:

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