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



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

一项活动面向主持游戏的玩家,另一项活动面向将加入他们的玩家。

当玩家加入时,主机活动会在 Firebase 数据库中创建一个名为"Matches"的子项,并在其中输入游戏详细信息,然后将主机发送到名为"OnlineGameForHost"的新活动,并将加入玩家发送到一个名为"OnlineGame"的新活动。然后,此活动尝试从数据库中的子"匹配"中检索数据,但我收到以下错误:NullPointerException。

我什至尝试在启动"在线游戏"活动之前添加 3 秒的延迟,以确保数据已经在 Firebase 上,但仍然没有任何效果。 但是,当另一个活动"OnlineGameForHost"启动时,我能够立即检索数据。这很奇怪

java.lang.NullPointerException: Try to invoke virtual method 'java.lang.String java.lang.Object.toString((' 在空对象上 参考 at 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 检查了所有这些孩子的名字。

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

当您比较一个变量(可能为 null(时,您应该始终喜欢像这样进行比较,

"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
}

相关内容

  • 没有找到相关文章

最新更新