我收到此错误,应用程序崩溃了'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()'

时间:2019-05-23 17:34:24

标签: java android nullpointerexception

当我在设备上运行该应用程序时,它崩溃了,当我检查Logcat时,这就是我得到的java.lang.String com.google.firebase.auth.FirebaseUser.getUid()

我试图找出问题所在,但无法正常工作。请帮助我

package com.qwekumens.chat2chat;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.qwekumens.chat2chat.Fragments.ChatsFragment;
import com.qwekumens.chat2chat.Fragments.UsersFragment;
import com.qwekumens.chat2chat.Model.User;

import java.util.ArrayList;

import de.hdodenhof.circleimageview.CircleImageView;

public class MainActivity extends AppCompatActivity
{
    FirebaseUser firebaseUser;
    DatabaseReference reference;

    CircleImageView profile_image;
    TextView username;



    @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);
        username = findViewById(R.id.uname);

        firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());

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

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

            @Override
            public void onCancelled(DatabaseError databaseError)
            {

            }
        });

        final TabLayout tabLayout = findViewById(R.id.tab_layout);
        final ViewPager viewPager = findViewById(R.id.view_pager);

        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());

        viewPagerAdapter.addFragment(new ChatsFragment(), "Chats");
        viewPagerAdapter.addFragment(new UsersFragment(), "Users");

        viewPager.setAdapter(viewPagerAdapter);

        tabLayout.setupWithViewPager(viewPager);
    }

    @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, StartPageActivity.class));
                finish();
                return true;
        }

        return false;
    }

    class ViewPagerAdapter extends FragmentPagerAdapter
    {
        private ArrayList<Fragment> fragments;
        private ArrayList<String> titles;

        ViewPagerAdapter(FragmentManager fm)
        {
            super(fm);
            this.fragments = new ArrayList<>();
            this.titles = new ArrayList<>();
        }

        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }

        @Override
        public int getCount() {
            return fragments.size();
        }

        public void addFragment(Fragment fragment, String title)
        {
            fragments.add(fragment);
            titles.add(title);
        }

        @Nullable
        @Override
        public CharSequence getPageTitle(int position)
        {
            return titles.get(position);
        }
    }
}

起因:java.lang.NullPointerException: Attempt to invoke virtual method java.lang.String com.google.firebase.auth.FirebaseUser.getUid() on a null object reference at com.qwekumens.chat2chat.MainActivity.onCreate(MainActivity.java:59)

2 个答案:

答案 0 :(得分:1)

看起来这两行引起了问题:

firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());

声明变量FirebaseUser firebaseUser;时,您将其设置为等于null,因为它没有指向的对象。

firebaseUser = FirebaseAuth.getInstance().getCurrentUser();行应该导致它指向FirebaseUser对象;但是,似乎没有这样做。我们可以说,因为当您尝试在其上调用getUid()时,会得到一个NullPointerException,这意味着您是在null对象(变量firebaseUser上)上对其进行调用是)。

因此,最终,代码FirebaseAuth.getInstance().getCurrentUser();返回了null

通过查看正在使用的库,看来getCurrentUser()是问题的根源。

  

公共FirebaseUser getCurrentUser()

     

返回当前登录的FirebaseUser;如果没有,则返回null。

     

使用getCurrentUser()!= null检查用户是否登录。

     

返回

     
      
  • 已登录的用户或为空
  •   

当您调用此代码时,似乎没有用户登录。

编辑:就像Sumit T所建议的那样,您应该通过将firebaseUser分配给FirebaseAuth.getInstance().getCurrentUser()后是否等于null来检查用户是否登录。

答案 1 :(得分:0)

根据日志,您所在的行有错误:

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

因此,您必须检查从中获得的价值是什么:

firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

您可以检查“ firebaseUser”是否为空值,然后继续。

编辑: 像这样:

if(firebaseUser!=null){
reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());

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

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

            @Override
            public void onCancelled(DatabaseError databaseError)
            {

            }
        });
}