我正在创建一个小型在线游戏,它有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检查所有子名称时,所有子名称都是正确的。
希望找到一些解决方案,谢谢! :)
答案 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
}