java - 我在空对象引用上有“java.lang.String com.google.firebase.auth.FirebaseUser.getUid()'”错误
问题描述
我有 AdapterPosts,我在我的项目中使用了 firebase。当我运行该程序时,它没有给出任何错误。但现在我不知道为什么它会给出这个错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
.Adapters.AdapterPosts.<init>(AdapterPosts.java:58)
.Fragments.HomeFragment$1.onDataChange(HomeFragment.java:95)
我的 AdapterPosts 是:
public class AdapterPosts extends RecyclerView.Adapter<AdapterPosts.MyHolder> {
Context context;
List<ModelPost> postList;
private DatabaseReference likesRef; //likes veritabanı için
private DatabaseReference postsRef;//posts reference
String myUid;
public AdapterPosts(Context context, List<ModelPost> postList) {
this.context = context;
this.postList = postList;
myUid = FirebaseAuth.getInstance().getCurrentUser().getUid();
}
@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//row_post.xml layoutunu dahil etme
View view = LayoutInflater.from(context).inflate(R.layout.row_posts, parent, false);
return new MyHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final MyHolder holder, final int position) {
//get data
final String uid = postList.get(position).getPost_uid();
String uEmail = postList.get(position).getPost_email();
String uName = postList.get(position).getPost_name();
String uDp = postList.get(position).getPost_dp();
final String pId = postList.get(position).getPost_Id();
String pTitle = postList.get(position).getPost_title();
String pDescription = postList.get(position).getPost_desc();
final String pImage = postList.get(position).getPost_image();
String pTimeStamp = postList.get(position).getPost_time();
String pComments = postList.get(position).getPost_comments();
//zaman göstergesini dd/mm/yyyy hh:mm am/pm şekline dönüştür
Calendar calendar = Calendar.getInstance(Locale.getDefault());
calendar.setTimeInMillis(Long.parseLong(pTimeStamp));
String pTime = DateFormat.format("dd/MM/yyyy hh:mm aa", calendar).toString();
//set data
holder.uName_Txt.setText(uName);
holder.pTime_Txt.setText(pTime);
holder.pTitle_Txt.setText(pTitle);
holder.pDesc_Txt.setText(pDescription);
holder.pComment_Txt.setText(pComments+" Comments");
//set user dp
try{
Picasso.get().load(uDp).placeholder(R.drawable.tag_face).into(holder.uPicture_Imw);
}
catch (Exception e){
}
//set post image
//eğer resim yoksa imageView'i gizle
if (pImage.equals("noImage")){
//imageView'i gizle
holder.pImage_Imw.setVisibility(View.GONE);
}
else {
//imageview göster
holder.pImage_Imw.setVisibility(View.VISIBLE);
try{
Picasso.get().load(pImage).into(holder.pImage_Imw);
}
catch (Exception e){
}
}
//button clicks
holder.more_Btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showMoreOptions(holder.more_Btn, uid, myUid, pId, pImage);
}
});
holder.comment_Btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//PostDetailActivity başlat
Intent intent = new Intent(context, PostDetailActivity.class);
intent.putExtra("postId",pId); //bu kimliği kullanarak gönderinin ayrıntılarını alacak, tıklanan gönderinin kimliği
context.startActivity(intent);
}
});
holder.share_Btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"Share", Toast.LENGTH_SHORT).show();
}
});
holder.profileLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//tıklandığında tıklayan kullanıcın uid'sini kullanarak ThereProfileActivity'e gidebilmek için
//ThereProfileActivity-> kullanıcının kendi gönderilerinin ve verilerinin gösterilmesi için
Intent intent = new Intent(context, ThereProfileActivity.class);
intent.putExtra("uid",uid);
context.startActivity(intent);
}
});
}
private void showMoreOptions(ImageButton more_btn, String uid, String myUid, final String pId, final String pImage) {
//postu silme işlemi için popup menu
PopupMenu popupMenu = new PopupMenu(context, more_btn, Gravity.END);
//delete seçeneğini sadece mevcut giriş yapmış kullanıcıya göster
if (uid.equals(myUid)) {
//Menuye item ekleme
popupMenu.getMenu().add(Menu.NONE, 0, 0, "Delete");
popupMenu.getMenu().add(Menu.NONE, 1,0, "Edit");
}
popupMenu.getMenu().add(Menu.NONE, 2,0, "View Detail");
//menu itemlerine onClick özelliği ekleme
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
int id = item.getItemId();
if(id == 0){
//delete tıklandı
beginDelete(pId, pImage);
}
else if(id == 1){
//edit tıklandı
//key "editPost" ve id ile tıklandığında AddPostActivity'i başlat
Intent intent = new Intent(context, AddPostActivity.class);
intent.putExtra("key","editPost");
intent.putExtra("editPostId", pId);
context.startActivity(intent);
}
else if(id == 2){
//PostDetailActivity başlat
Intent intent = new Intent(context, PostDetailActivity.class);
intent.putExtra("postId",pId); //bu kimliği kullanarak gönderinin ayrıntılarını alacak, tıklanan gönderinin kimliği
context.startActivity(intent);
}
return false;
}
});
//menuyu gösterme
popupMenu.show();
}
private void beginDelete(String pId, String pImage) {
//gönderi resimli veya resimsiz olabilir
if (pImage.equals("noImage")){
//resimsiz gönderi
deleteWithOutImage(pId);
}
else {
//resimli gönderi
deleteWithImage(pId, pImage);
}
}
private void deleteWithImage(final String pId, String pImage) {
//progressbar
final ProgressDialog pd = new ProgressDialog(context);
pd.setMessage("Deleting...");
//postu ilk önce url'ini kullanarak sil. Daha sonra gönderinin id'sini kullanarak veritabanından siler
StorageReference picRef = FirebaseStorage.getInstance().getReferenceFromUrl(pImage);
picRef.delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
//resim silindi, şimdi veritabanından sil
Query fquery = FirebaseDatabase.getInstance().getReference("Posts").orderByChild("post_Id").equalTo(pId);
fquery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot ds: snapshot.getChildren()){
ds.getRef().removeValue();//pid'nin eşleştiği yerde değerleri firebase'den kaldır
}
//deleted
Toast.makeText(context,"Deleted successfully", Toast.LENGTH_SHORT).show();
pd.dismiss();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
//failed
pd.dismiss();
Toast.makeText(context,""+e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
private void deleteWithOutImage(String pId) {
//progressbar
final ProgressDialog pd = new ProgressDialog(context);
pd.setMessage("Deleting...");
Query fquery = FirebaseDatabase.getInstance().getReference("Posts").orderByChild("post_Id").equalTo(pId);
fquery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot ds: snapshot.getChildren()){
ds.getRef().removeValue();//pid'nin eşleştiği yerde değerleri firebase'den kaldır
}
//deleted
Toast.makeText(context,"Deleted successfully", Toast.LENGTH_SHORT).show();
pd.dismiss();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
@Override
public int getItemCount() {
return postList.size();
}
//view holder class
class MyHolder extends RecyclerView.ViewHolder{
//rows_post.xml view'leri
ImageView uPicture_Imw, pImage_Imw;
TextView uName_Txt, pTime_Txt, pTitle_Txt, pDesc_Txt, pComment_Txt;
ImageButton more_Btn, comment_Btn, share_Btn;
LinearLayout profileLayout;
public MyHolder(@NonNull View itemView) {
super(itemView);
//init views
uPicture_Imw = itemView.findViewById(R.id.uPicture_Imw);
pImage_Imw = itemView.findViewById(R.id.pImage_Imw);
uName_Txt = itemView.findViewById(R.id.uName_Txt);
pTime_Txt = itemView.findViewById(R.id.pTime_Txt);
pTitle_Txt = itemView.findViewById(R.id.pTitle_Txt);
pDesc_Txt = itemView.findViewById(R.id.pDesc_Txt);
pComment_Txt = itemView.findViewById(R.id.pComments_Txt);
more_Btn = itemView.findViewById(R.id.more_Btn);
comment_Btn = itemView.findViewById(R.id.comment_Btn);
share_Btn = itemView.findViewById(R.id.share_Btn);
profileLayout = itemView.findViewById(R.id.profileLayout);
}
}
}
我该如何解决这个错误?请帮忙。我尝试了一些方法,比如if(mFirebaseUser != null) { currentUserID = mFirebaseUser.getUid(); }
解决方案
错误消息告诉您FirebaseAuth.getInstance().getCurrentUser()
返回 null,这意味着在此代码运行时用户未登录。您将不得不检查这种情况。如果您希望用户已经登录,您应该使用身份验证状态侦听器来获取回调,以了解用户对象何时首次可供使用。
推荐阅读
- swift - 为什么这个组合订阅不会在自定义 ViewModifier 中解除分配?
- php - 数据库模式树形视图 PHP MYSQL
- sql - 不重复相同的数据
- arrays - 如何将嵌套字典插入到 Swift 中的字典中
- c# - 我正在尝试转换一些 C# 代码,以便它可以处理 64 位地址
- reactjs - 使用 React Router 访问特定 URL
- amazon-web-services - scp 从本地计算机到 EC2 实例(使用 WSL) - 权限被拒绝(公钥)
- kotlin - Kotlin 按索引列表过滤字符串
- c# - 将 JSON 返回到客户端时,“从客户端检测到潜在危险的 Request.Form 值”
- node.js - 当我通过 req.body.status 选择它时,在节点处未定义