Firebase数据库中已经存在数据的java.lang.NullPointerException,我正在尝试检索它

时间:2018-10-18 18:06:36

标签: java android pointers exception null

我正在创建一个小型在线游戏,它有4个主要活动:

为主持游戏的玩家进行的一项活动,为将加入游戏的玩家进行的另一项活动。

玩家加入后,主机活动会在Firebase数据库中创建一个名为“比赛”的子代,并在其中输入游戏详细信息,然后将主机发送到名为“ OnlineGameForHost”的新活动中,并将参与玩家发送到新活动中称为“ OnlineGame”。然后,此活动尝试从数据库中的子“匹配”检索数据,但出现以下错误:NullPointerException。

我什至试图在启动“ OnlineGame”活动之前添加3秒的延迟,以确保数据已经在Firebase上,但仍然没有任何作用。 但是,当另一个Activity“ OnlineGameForHost”启动时,我能够立即检索数据。.

  

java.lang.NullPointerException:尝试调用虚拟方法   空对象上的'java.lang.String java.lang.Object.toString()'   参考                         在Premiereapplication.automation.test.goldsilver_f.OnlineGame $ 3.onDataChange(OnlineGame.java:171)

mUsersDatabase.child("Matches").child(WhenJoining.need+","+mCurrentUser.getUid()).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if  (dataSnapshot.child(WhenJoining.need).child("ready").getValue().toString().equals("yes") && dataSnapshot.child(mCurrentUser.getUid()).child("ready").getValue().toString().equals("yes"))
            {


            }

PS:第171行是“ if”语句,只不过当我使用Toasts检查所有子名称时,所有子名称都是正确的。

希望找到一些解决方案,谢谢! :)

1 个答案:

答案 0 :(得分:0)

在比较可能为空的变量时,应该始终喜欢这样进行比较,

"yes".equals(varname)

而不是

varname.equals("yes")

这至少可以避免在varname为null的情况下避免NullPointerException,同时保持逻辑完全相同。

在您指定的代码段中,如下所示,

dataSnapshot.child(WhenJoining.need).child("ready").getValue()

为null,调用toString()方法会给您在问题中发布的错误。您可以在代码中做类似的事情来避免它,

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    // instead of Object o = ... you can declare the exact class that is returned
    Object o1 = dataSnapshot.child(WhenJoining.need).child("ready").getValue();
    Object o2 = dataSnapshot.child(mCurrentUser.getUid()).child("ready").getValue();
    if  ((o1 != null && "yes".equals(o1.toString())) && (o2 != null && "yes".equals(o2.toString())))
    {
    // your code here

    }