有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓试图调用虚拟方法“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,但仍然不起作用


共 (3) 个答案

  1. # 1 楼答案

    两件事:

    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
        }
    });
    
  2. # 2 楼答案

    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) {
    
        }
    });
    
  3. # 3 楼答案

    我的建议是调试服务器返回的数据。您可以使用日志,也可以简单地在文本视图中打印请求的整个结果。这样您就可以看到api返回了什么。你可能会得到一个具有其他结构的对象