为什么在此android项目中出现NullPointer异常

时间:2019-05-27 21:19:42

标签: android firebase firebase-realtime-database nullpointerexception

我是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) {

        }
    });

帮我解决这个问题。

我验证了数据库中是否存在空对象,但没有找到任何空对象。

我还尝试将所有String变量都设置为全局变量,但这也不起作用

最后是注册用户后我的数据库图片。

link to database screenshot

2 个答案:

答案 0 :(得分:1)

根据API文档,当您查询的位置没有数据时,getValue()返回null。您应该在调用getValue()之前检查数据是否实际上exists(),或者至少在调用toString()之前手动检查是否为null。

答案 1 :(得分:0)

您在数据库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) {

    }
});