Почему я получаю исключение NullPointer в этом проекте Android - PullRequest
1 голос
/ 28 мая 2019

Я новичок в базе данных FireBase.Я написал этот код для получения пользовательских данных после аутентификации.Часть аутентификации работает хорошо, но часть получения данных приводит к сбою моего приложения с этой ошибкой.

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
    at com.kcw.firebasebasics.UserInterface$1.onDataChange(UserInterface.java:58)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@17.0.0:75)
    at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@17.0.0:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@17.0.0:55)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)

Вот код, который я написал, и я написал комментарий к строке 58 (строка, вызывающая ошибку), чтобыидентифицируйте его.

   FirebaseUser firebaseUser;
   DatabaseReference reference;
   TextView greeting;
   String name,text;
   protected void onCreate(Bundle savedInstanceState) 
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_interface);
    firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    reference =FirebaseDatabase.getInstance().getReference() 
     .child(firebaseUser.getUid());
    greeting = findViewById(R.id.greet_msg);

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                String text = dataSnapshot.getValue().toString();//line 58

            try {
                JSONObject object = new JSONObject(text);
                name = object.getString("username");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            String message = "WELCOME ";
            message = message + name.toUpperCase();
            greeting.setText(message);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

Помогите мне решить эту проблему.

Я проверил, есть ли в моей базе данных нулевой объект, и я не нашел ни одного.

Я такжепопытался сделать все мои строковые переменные глобальными, но это тоже не сработало

И, наконец, изображение моей базы данных после регистрации пользователей.

ссылка на скриншот базы данных

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Согласно документации API, getValue () возвращает значение NULL, если в указанном вами месте нет данных.Вы должны проверить, существуют ли на самом деле данные () , прежде чем вызывать getValue (), или, по крайней мере, вручную проверять нулевое значение перед вызовом toString ().

0 голосов
/ 28 мая 2019

В базе данных указан неверный путь reference, он должен находиться под users узлом:

reference = FirebaseDatabase.getInstance().getReference() 
    .child("users").child(firebaseUser.getUid());
greeting = findViewById(R.id.greet_msg);

reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if(dataSnapshot.exist()) {
          String text = dataSnapshot.getValue().toString();//line 58

          try {
            JSONObject object = new JSONObject(text);
            name = object.getString("username");
          } catch (JSONException e) {
            e.printStackTrace();
          }
          String message = "WELCOME ";
          message = message + name.toUpperCase();
          greeting.setText(message);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

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