【问题标题】:Why am I getting NullPointer Exception in this Android project为什么我在这个 Android 项目中得到 NullPointer 异常
【发布时间】:2019-10-13 09:53:38
【问题描述】:

我是 FireBase 数据库的初学者。我编写了这段代码用于在身份验证后检索用户数据。身份验证部分运行良好,但数据检索部分导致我的应用程序因此错误而崩溃。

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String java.lang.Object.toString()”

在 com.kcw.firebasebasics.UserInterface$1.onDataChange(UserInterface.java:58)
在 com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@17.0.0:75)
在 com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@17.0.0:63)
在 com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@17.0.0:55)
在 android.os.Handler.handleCallback(Handler.java:739)
在 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) {

        }
    });

帮我解决这个问题。

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

我也尝试将我的所有字符串变量设为全局变量,但这也不起作用

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

link to database screenshot

【问题讨论】:

  • 您好。在DatabaseReference 对象上,您不必在.child(firebaseUser.getUid()) 之前调用.child("users") 吗?
  • 是的,我刚刚意识到并修复了它。谢谢你

标签: android firebase firebase-realtime-database nullpointerexception


【解决方案1】:

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

    }
}); 

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      相关资源
      最近更新 更多