-1

My data structure:

My code:

@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();

    }

}

}

I am always getting the Attempt to invoke virtual method java.lang.String com.dantools.OurChat.Model.User.getUsername() on a null object reference error when I login.

I tried to change some things but it doesn't work no matter what. I also tried to change the HashMap in the registerActivity but it still doesn't work.

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807

3 Answers3

0
Attempt to invoke virtual method 'java.lang.String com.dantools.OurChat.Model.User.getUsername()' on a null object reference

You get NullPointerException in below line:

username.setText(user.getUsername());

Try to check first if the datasnapshot exists using dataSnapshot.exists(), and return otherwise

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

    }
});
Zain
  • 37,492
  • 7
  • 60
  • 84
0

My recommendation is that you debug the data returned by the server. You can use a Log or simply print the entire result of the request in a TextView. So you can see what your api is returning. You may be getting an object with another structure.

0

Two things:

  1. You should not pass your database name into getReference(). So reference = FirebaseDatabase.getInstance().getReference("Users");

  2. Your Users node contains multiple users under it, but the code in your onDataChange tries to read the properties of a single child from it. This won't work. You'll either have to read a single child (by getReference("Users/28u1...MVD3")) or handle the fact that you can have multiple children.

For example:

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
    }
});
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807