请在此帮助(面试之前)
我正在尝试上传图片,当它开始向上倾斜时,它崩溃了 并删除两个基本子级(图像,缩略图)
E / Android运行时:致命异常:主要 流程:com.example.pc.newchatj,PID:9350 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.lang.String java.lang.Object.toString()” 在com.example.pc.newchatj.SettingsActivity $ 1.onDataChange(SettingsActivity.java:103) com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database @@ 16.0.4:75) com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database @@ 16.0.4:63) com.google.firebase.database.core.view.EventRaiser $ 1.run(com.google.firebase:firebase-database @@ 16.0.4:55) 在android.os.Handler.handleCallback(Handler.java:739) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:135) 在android.app.ActivityThread.main(ActivityThread.java:5254) 在java.lang.reflect.Method.invoke(本机方法) 在java.lang.reflect.Method.invoke(Method.java:372) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
在我的Firebase数据库中,它删除了两个孩子(image,thumb_image)
任何人都可以帮助
mUserDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String name = dataSnapshot.child("name").getValue().toString();
String image = dataSnapshot.child("image").getValue().toString();
String status = dataSnapshot.child("status").getValue().toString();
String thumb_image = dataSnapshot.child("thumb_image").getValue().toString();
mName.setText(name);
mStatus.setText(status);
if (!image.equals("default")) {
Picasso.get().load(image).placeholder(R.drawable.default_avatar).into(mDisplayImage);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
我为两者(图片,缩略图)都添加了StorageReference
filepath.putFile(resultUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if (task.isSuccessful()){
UploadTask uploadTask = thumb_filepath.putBytes(thumb_byte);
uploadTask.addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> thumb_task) {
if (thumb_task.isSuccessful()){
//getting regular image download url
filepath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
download_urll = uri.toString();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(SettingsActivity.this, "Regular fail", Toast.LENGTH_SHORT).show();
}
});
//getting thumbnail download url
thumb_filepath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri thumb_uri) {
thumb_downloadUrl = thumb_uri.toString();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(SettingsActivity.this, "thumb failed", Toast.LENGTH_SHORT).show();
}
});
Map update_hashMap = new HashMap();
update_hashMap.put("image" , download_urll);
update_hashMap.put("thumb_image" , thumb_downloadUrl);
mUserDatabase.updateChildren(update_hashMap).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
avi_settings.smoothToHide();
avi_settings.setVisibility(View.INVISIBLE);
Toast.makeText(SettingsActivity.this, "Successfully uploaded", Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
Toast.makeText(SettingsActivity.this, "working", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(SettingsActivity.this, "Error uploading file", Toast.LENGTH_SHORT).show();
avi_settings.smoothToHide();
avi_settings.setVisibility(View.INVISIBLE);
}
}
});
答案 0 :(得分:0)
在尝试从dataSnapshot
对象获取数据之前,应检查该数据是否确实存在:
mUserDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) { //Check for existens
String name = dataSnapshot.child("name").getValue(String.class);
String image = dataSnapshot.child("image").getValue(String.class);
String status = dataSnapshot.child("status").getValue(String.class);
String thumb_image = dataSnapshot.child("thumb_image").getValue(String.class);
mName.setText(name);
mStatus.setText(status);
if (!image.equals("default")) {
Picasso.get().load(image).placeholder(R.drawable.default_avatar).into(mDisplayImage);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
});
最好也将String.class
传递给getValue()
方法,以将其强制转换为String。您将不再再获得任何NullPointerException
。
答案 1 :(得分:0)
在您编写NullPointerException时,它会出现在行
String name = dataSnapshot.child("name").getValue().toString();
该错误消息表明您尝试在空对象上调用.toString()
。
您应该保存来自String name = dataSnapshot.child("name").getValue()
的结果,并在调用.toSring()
方法之前检查它是否不为null。
答案 2 :(得分:0)
使用它
store.setUrl((String) snapshot1.child("url").getValue());
store.setName((String) snapshot1.child("name").getValue());
代替
store.setUrl(snapshot1.child("url").getValue().toString());
store.setName(snapshot1.child("name").getValue().toString());
答案 3 :(得分:-1)
我知道这不是技术问题,但它可能是一个错误,所以请检查您的孩子或参考名称是否与您的数据库中的相同。我花了 3 天时间修复相关的错误,最终找到了错误的参考名称。 我希望如果它可以帮助。 谢谢。