【问题标题】:Attempt to invoke virtual method 'java.lang.String com.dantools.OurChat.Model.User.getUsername()' on a null object reference尝试在空对象引用上调用虚拟方法“java.lang.String com.dantools.OurChat.Model.User.getUsername()”
【发布时间】:2020-06-07 11:00:22
【问题描述】:

我的数据结构:

我的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setTitle("");

    profile_image = findViewById(R.id.profile_image);

    firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    username = findViewById(R.id.username);

    reference = FirebaseDatabase.getInstance().getReference("databasename").child("Users");

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);
            username.setText(user.getUsername());

            if (user.getImageURL().equals("default")) {
                    profile_image.setImageResource(R.mipmap.ic_launcher);
            } else {
                Glide.with(MainActivity.this).load(user.getImageURL()).into(profile_image);
            }
        }

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

        }
    });
}

@Override
public boolean onCreateOptionsMenu (Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
}

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.logout:
                FirebaseAuth.getInstance().signOut();
                startActivity(new Intent(MainActivity.this, StartActivity.class));
                finish();
                return true;
        }

        return false;
}
@Override
protected void onStart(){
    super.onStart();
    if(firebaseUser == null) {
        Intent homeIntent = new Intent(MainActivity.this, StartActivity.class);
        homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(homeIntent);
        finish();

    }

}

}

登录时,我总是在空对象引用错误时尝试调用虚拟方法java.lang.String com.dantools.OurChat.Model.User.getUsername()

我试图改变一些东西,但无论如何它都不起作用。 我也试过改registerActivity里面的HashMap还是不行。

【问题讨论】:

标签: java android firebase firebase-realtime-database


【解决方案1】:
Attempt to invoke virtual method 'java.lang.String com.dantools.OurChat.Model.User.getUsername()' on a null object reference

你在下面一行得到 NullPointerException:

username.setText(user.getUsername());

先尝试使用dataSnapshot.exists()检查datasnapshot是否存在,否则返回

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

        if (!dataSnapshot.exists()) {
            return;
        }


        User user = dataSnapshot.getValue(User.class);
        username.setText(user.getUsername());

        if (user.getImageURL().equals("default")) {
                profile_image.setImageResource(R.mipmap.ic_launcher);
        } else {
            Glide.with(MainActivity.this).load(user.getImageURL()).into(profile_image);
        }
    }

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

    }
});

【讨论】:

    【解决方案2】:

    我的建议是你调试服务器返回的数据。您可以使用 Log 或简单地在 TextView 中打印请求的整个结果。所以你可以看到你的api返回了什么。您可能会得到一个具有其他结构的对象。

    【讨论】:

      【解决方案3】:

      两件事:

      1. 您不应将数据库名称传递给getReference()。所以reference = FirebaseDatabase.getInstance().getReference("Users");

      2. 您的Users 节点下包含多个用户,但您的onDataChange 中的代码尝试从中读取单个子节点的属性。这行不通。您要么必须阅读一个孩子(getReference("Users/28u1...MVD3")),要么处理您可以拥有多个孩子的事实。

      例如:

      reference = FirebaseDatabase.getInstance().getReference("Users");
      
      reference.addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
              for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
                  User user = dataSnapshot.getValue(User.class);
                  Log.i("User", user.getUsername());
              }
          }
      
          @Override
          public void onCancelled(@NonNull DatabaseError databaseError) {
              throw databaseError.toException(); // never ignore errors
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-25
        • 2017-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多