java.lang.NullPointerException для данных, которые уже существуют в базе данных Firebase, и я пытаюсь получить их - PullRequest
0 голосов
/ 18 октября 2018

Я создаю небольшую онлайн-игру, в которой есть 4 основных действия:

Деятельность для игроков, которые ведут игру, и еще одна для игроков, которые присоединятся к ним.

Когда игрокприсоединяясь, действие хоста создает дочернюю структуру с именем «Matches» в базе данных Firebase и вводит в нее сведения об игре, затем отправляет хост новой активности с именем «OnlineGameForHost» и присоединяющегося игрока к новой активности с именем «OnlineGame».Затем это действие пытается извлечь данные из дочерних «совпадений» в базе данных, но я получаю эту ошибку: NullPointerException.

Я даже пытался добавить задержку в 3 секунды перед запуском «OnlineGame», чтобы убедиться, что данныеуже на Firebase, но все еще ничего не работает.Однако я могу получить данные мгновенно, когда запускается другая активность «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 - этозаявление «если» и просто упомянуть, что все дочерние имена верны, поскольку я проверил их все с помощью тостов.

Надеюсь найти какие-то решения и спасибо!:)

1 Ответ

0 голосов
/ 18 октября 2018

Когда вы сравниваете переменную, которая может быть нулевой, вы всегда должны предпочитать делать сравнение следующим образом:

"yes".equals(varname)

вместо

varname.equals("yes")

Это будетпо крайней мере избегайте вашего NullPointerException в случае, если varname имеет значение null, сохраняя логику в точности такой же.

В данном фрагменте кода это выглядит так,

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

равно нулю и вызывает 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

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...