当我在设备上运行该应用程序时,它崩溃了,当我检查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)
答案 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)
{
}
});
}