安卓试图调用虚拟方法“java”。String.com。丹图尔斯。我们的聊天室。模型使用者空对象引用上的getUsername()
我的数据结构:
我的代码:
@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
,但仍然不起作用
# 1 楼答案
两件事:
您不应该将数据库名传递到
getReference()
。所以reference = FirebaseDatabase.getInstance().getReference("Users");
您的
Users
节点下包含多个用户,但onDataChange
中的代码试图从中读取单个子节点的属性。这行不通。你要么读一个孩子(通过getReference("Users/28u1...MVD3")
),要么处理你可以有多个孩子的事实例如:
# 2 楼答案
在下面一行中可以看到NullPointerException:
首先尝试使用
dataSnapshot.exists()
检查datasnapshot是否存在,否则返回# 3 楼答案
我的建议是调试服务器返回的数据。您可以使用日志,也可以简单地在文本视图中打印请求的整个结果。这样您就可以看到api返回了什么。你可能会得到一个具有其他结构的对象