3

This is the error displayed in my catlog. It shows error at line 89 of HomeActivity, the user.getName() is null. I am new to android so I am not able to fix this error.

    E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.android_foodbot, PID: 12641
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android_foodbot/com.example.android_foodbot.HomeActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.android_foodbot.AccountActivity.User.getName()' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
         Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.android_foodbot.AccountActivity.User.getName()' on a null object reference
            at com.example.android_foodbot.HomeActivity.onCreate(HomeActivity.java:89)
            at android.app.Activity.performCreate(Activity.java:6237)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
            at android.app.ActivityThread.-wrap11(ActivityThread.java) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:148) 
            at android.app.ActivityThread.main(ActivityThread.java:5417) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

SignInActivity :

    public class SignUpActivity extends AppCompatActivity {

        private EditText inputName,  inputPhone, inputEmail,  inputPassword;
        private FirebaseAuth auth;
        private Button btnSignUp, btnLogin;

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

            auth = FirebaseAuth.getInstance();

            btnLogin = (Button) findViewById(R.id.btn_for_login);
            btnSignUp = (Button) findViewById(R.id.btn_for_signUp);
            inputName = (EditText) findViewById(R.id.name);
            inputPhone = (EditText) findViewById(R.id.phone);
            inputEmail = (EditText) findViewById(R.id.email);
            inputPassword = (EditText) findViewById(R.id.password);

            btnLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    finish();
                }
            });

            btnSignUp.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    final ProgressDialog mDialog = new ProgressDialog(SignUpActivity.this);
                    mDialog.setMessage("Loading... Please wait!");
                    mDialog.show();

                    final String name = inputName.getText().toString().trim();
                    final String phone = inputPhone.getText().toString().trim();
                    final String email = inputEmail.getText().toString().trim();
                    String password = inputPassword.getText().toString().trim();

                    if (TextUtils.isEmpty(name)) {
                        mDialog.dismiss();

                        Toast.makeText(getApplicationContext(), "Enter your name!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    if (TextUtils.isEmpty(phone)) {
                        mDialog.dismiss();

                        Toast.makeText(getApplicationContext(), "Enter your phone number!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    if (TextUtils.isEmpty(email)) {
                        mDialog.dismiss();

                        Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    if (TextUtils.isEmpty(password)) {
                        mDialog.dismiss();

                        Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    if (password.length() < 6) {
                        mDialog.dismiss();

                        Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show();
                        return;
                    }


                    auth.createUserWithEmailAndPassword( email, password)
                            .addOnCompleteListener(SignUpActivity.this, new OnCompleteListener<AuthResult>() {
                                @Override
                                public void onComplete(@NonNull Task<AuthResult> task) {

                                    if (task.isSuccessful()) {

                                        final User user = new User(
                                                name,
                                                email,
                                                phone
                                        );

                                        FirebaseDatabase.getInstance().getReference("Users")
                                                .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                                                .setValue(user).addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task) {
                                                mDialog.dismiss();
                                                if (task.isSuccessful()) {
                                                    mDialog.dismiss();

                                                    startActivity(new Intent(SignUpActivity.this, LoginActivity.class));
                                                    finish();
                                                } else {

                                                }
                                            }
                                        });

                                    } else {
                                        mDialog.dismiss();
                                        Toast.makeText(SignUpActivity.this, "Authentication failed." + task.getException(),
                                                Toast.LENGTH_SHORT).show();

                                    }
                                }
                            });

                }
            });
        }


    }

LoginActivity:

    public class LoginActivity extends AppCompatActivity {

        private EditText inputEmail, inputPassword;
        private FirebaseAuth auth;
        private Button btnSignUp, btnLogin;


        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);

            auth = FirebaseAuth.getInstance();

            if (auth.getCurrentUser() != null) {
                startActivity(new Intent(LoginActivity.this, HomeActivity.class));
                finish();
            }

            setContentView(R.layout.activity_login);
            inputEmail = (EditText) findViewById(R.id.email);
            inputPassword = (EditText) findViewById(R.id.password);
            btnLogin = (Button) findViewById(R.id.btn_login);
            btnSignUp = (Button) findViewById(R.id.btn_signUp);


            auth = FirebaseAuth.getInstance();

            btnSignUp.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    startActivity(new Intent(LoginActivity.this, SignUpActivity.class));
                }
            });


            btnLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    final ProgressDialog mDialog = new ProgressDialog(LoginActivity.this);
                    mDialog.setMessage("Loading... Please wait!");
                    mDialog.show();

                    String email = inputEmail.getText().toString();
                    final String password = inputPassword.getText().toString();

                    if (TextUtils.isEmpty(email)) {
                        mDialog.dismiss();

                        Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    if (TextUtils.isEmpty(password)) {
                        mDialog.dismiss();

                        Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show();
                        return;
                    }


                    auth.signInWithEmailAndPassword(email, password)
                            .addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() {
                                @Override
                                public void onComplete(@NonNull Task<AuthResult> task) {
                                    if (!task.isSuccessful()) {

                                        if (password.length() < 6) {
                                            inputPassword.setError(getString(R.string.minimum_password));
                                        } else {
                                            Toast.makeText(LoginActivity.this, getString(R.string.auth_failed), Toast.LENGTH_LONG).show();
                                        }
                                    } else {
                                        mDialog.dismiss();

                                        FirebaseDatabase database = FirebaseDatabase.getInstance();
                                            String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
                                            FirebaseDatabase.getInstance().getReference(uid).addListenerForSingleValueEvent(new ValueEventListener() {
                                                @Override
                                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                                    User user = dataSnapshot.child("name").getValue(User.class);
                                                    Intent intent = new Intent(LoginActivity.this, HomeActivity.class);
                                                    Common.currentUser = user;
                                                    startActivity(intent);
                                                    finish();
                                                }

                                                @Override
                                                public void onCancelled(@NonNull DatabaseError databaseError) {
                                                    throw databaseError.toException();

                                                }
                                            });


                                    }
                                }
                            });


                }
            });
        }
    }

User class has three parameters along with their constructer and getter setter:

    public String name, email, phone;

Nav_header_home layout where the user detail has to be displayed :

    <TextView
        android:id="@+id/textUserName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:text="@string/username"
         android:textColor="#ffffff"
        android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

Home Activity:

public class HomeActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {


    RecyclerView recycler_menu;
    RecyclerView.LayoutManager layoutManager;


    FirebaseDatabase database;
    DatabaseReference category;
    FirebaseRecyclerAdapter<Category, MenuViewHolder> adapter;

    TextView txtUserName;


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


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

                //        Init Firebase
        database = FirebaseDatabase.getInstance();
        category = database.getReference("Category");

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent cartIntent = new Intent(HomeActivity.this, CartActivity.class);
                startActivity(cartIntent);
//                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
//                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        FirebaseDatabase database = FirebaseDatabase.getInstance();
        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();


        FirebaseDatabase.getInstance().getReference().child("User").child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                Common.currentUser = dataSnapshot.getValue(User.class);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                throw databaseError.toException();

            }
        });

        //        Set Name for User
        View headerView = navigationView.getHeaderView(0);
        txtUserName = (TextView)findViewById(R.id.textUserName);
        txtUserName.setText(Common.currentUser.getName());

//      Loading menu
        recycler_menu = findViewById(R.id.recycler_menu);
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 2);
        recycler_menu.setLayoutManager(layoutManager);
      recycler_menu.addItemDecoration(new GridSpacingItemDecoration(2, dpToPx(10), true));

    }

       /**
     * RecyclerView item decoration - give equal margin around grid item
     */
    public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {

        private int spanCount;
        private int spacing;
        private boolean includeEdge;

        public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) {
            this.spanCount = spanCount;
            this.spacing = spacing;
            this.includeEdge = includeEdge;
        }

        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            int position = parent.getChildAdapterPosition(view); // item position
            int column = position % spanCount; // item column

            if (includeEdge) {
                outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing)
                outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing)

                if (position < spanCount) { // top edge
                    outRect.top = spacing;
                }
                outRect.bottom = spacing; // item bottom
            } else {
                outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing)
                outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f /    spanCount) * spacing)
                if (position >= spanCount) {
                    outRect.top = spacing; // item top
                }
            }
        }
    }

    /**
     * Converting dp to pixel
     */
    private int dpToPx(int dp) {
        Resources r = getResources();
        return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics()));
    }


    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.home, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()){
            case R.id.logout:
                FirebaseAuth.getInstance().signOut();
                finish();
                startActivity(new Intent(this, LoginActivity.class));
                break;
        }

        return true;

//        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_menu) {
            // Handle the camera action
        } else if (id == R.id.nav_orders) {

        } else if (id == R.id.nav_cart) {

        } else if (id == R.id.nav_logout) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    @Override
    protected void onResume() {
        super.onResume();
//        loadMenu();

        adapter = new FirebaseRecyclerAdapter<Category, MenuViewHolder>(Category.class,
                R.layout.menu_item,
                MenuViewHolder.class,
                category) {
            @Override
            protected void populateViewHolder(MenuViewHolder viewHolder, Category model, int position) {
                viewHolder.txtMenuName1.setText(model.getName1());
//                viewHolder.txtMenuPrice1.setText(model.getPrice1());
                Picasso.with(getBaseContext()).load(model.getImage1())
                        .into(viewHolder.imageView1);

                final Category clickItem = model;
                viewHolder.setItemClickListener(new ItemClickListener() {
                    @Override
                    public void onClick(View view, int position, boolean isLongClick) {
//
                        // Get Category id and Start new activity
                        Intent foodList = new Intent(HomeActivity.this, 

    FoodListActivity.class);
                            foodList.putExtra("CategoryId", adapter.getRef(position).getKey());
                            startActivity(foodList);

                        }
                    });

                }
            };
            recycler_menu.setAdapter(adapter);
        }
    }
susmita rai
  • 39
  • 2
  • 20
  • @CarlosCavero I have no clue how the majority of your edit reverted the second revision, but I'll assume it's a race condition. But about your formatting: avoid quote formatting for errors. It just makes it unreadable - use code blocks instead. Also, don't add the Android Studio tag if the question isn't about the IDE – Zoe Mar 13 '19 at 20:55

3 Answers3

1

I guess the problem is here. User user = dataSnapshot.child("name").getValue(User.class);

Case 1: If you need only the user name it should be: String name = dataSnapshot.child("name").getValue(String.class);

Case 2: If you need entire user object it should be: User user = dataSnapshot.getValue(User.class);

Because your reference points to a string object, not to a user object.

As I understood from your code (Common.currentUser = user) you probably need directly user object.(Case 2)

Soner Say
  • 106
  • 5
  • Thank you Soner Say for providing your answer. But I am still having the same error. I looked over firebase document as well and tried to get the uid from firebase authentication and display the associated information regarding that uid from firebase database. It's not working.. Any more suggestion?? – susmita rai Mar 14 '19 at 05:45
  • Probably your database has some problems. – Soner Say Mar 14 '19 at 05:48
  • Your reference is FirebaseDatabase.getReference(uid), but when you are creating a new user you create it under User/. So you should do **FirebaseDatabase.getInstance().getReference().child("User").child(uid)** instead of **FirebaseDatabase.getInstance().getReference(uid)** – Soner Say Mar 14 '19 at 05:53
  • I tried that too...But every time it just display the same error. – susmita rai Mar 14 '19 at 06:04
1

Update your code in Login Activity like

User user = dataSnapshot.getValue(User.class);

and also you not get the child("Users").So update your code like

FirebaseDatabase database = FirebaseDatabase.getInstance();
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();


FirebaseDatabase.getInstance().getReference("Users").child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);
            Intent intent = new Intent(LoginActivity.this, HomeActivity.class);
            Common.currentUser = user;
            startActivity(intent);
            finish();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException();

        }
    });

And in your Home Activity you give child("User") but you need to give child("Users")

I hope that can help you!

Thank You.

Hardik Talaviya
  • 1,396
  • 5
  • 18
0
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
                                    FirebaseDatabase.getInstance().getReference(uid).addListenerForSingleValueEvent(new ValueEventListener() {
                                        @Override
                                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                            User user = dataSnapshot.child("name").getValue(User.class);
                                            Intent intent = new Intent(LoginActivity.this, HomeActivity.class);
                                            Common.currentUser = user;
                                            startActivity(intent);
                                            finish();
                                        }

                                        @Override
                                        public void onCancelled(@NonNull DatabaseError databaseError) {
                                            throw databaseError.toException();

                                        }
                                    });

If you replace this piece with this, your problem will be much likely solved. If not, maybe you need to share your database in json format(at least Users/)

// You should check if uid == null?
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
                                    FirebaseDatabase.getInstance().getReference().child("Users").child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
                                        @Override
                                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                            User user = dataSnapshot.getValue(User.class);
                                            Intent intent = new Intent(LoginActivity.this, HomeActivity.class);
                                            Common.currentUser = user;
                                            startActivity(intent);
                                            finish();
                                        }

                                        @Override
                                        public void onCancelled(@NonNull DatabaseError databaseError) {
                                            throw databaseError.toException();

                                        }
                                    });
Soner Say
  • 106
  • 5
  • I had done exactly the same. But its not working. Here is my User data from database. "Users" : { "OWVjxlxRgMQk7TP18HT9PxsCAl72" : { "email" : "hosanna@gmail.com", "name" : "hosanna", "phone" : "9813546256" } } – susmita rai Mar 14 '19 at 06:49
  • I checked uid == null or not ..And the toast display the uid – susmita rai Mar 14 '19 at 06:58
  • I check if user == null, and yes it shows that the user is null.. User user = dataSnapshot.getValue(User.class); this user variable is null. What should I do? – susmita rai Mar 14 '19 at 07:04
  • The thing that first comes to my mind is that app cannot connect to database or uid in the code and id in the database does not match. – Soner Say Mar 14 '19 at 07:33
  • uid and id in the database has matched. But the user object is null – susmita rai Mar 14 '19 at 07:50
  • I am out of solutions, if you provide source code with a repo link or something like that, maybe me or someone can be more helpful. – Soner Say Mar 14 '19 at 08:12
  • Thank you so much for trying to help me. – susmita rai Mar 14 '19 at 08:24