我正在创建一个小型在线游戏,它有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
}