java - FireBase 上传和检索图像 - NullPointerException
问题描述
尝试将图像文件上传到 FireBase 存储和 Firebase 数据库,然后稍后检索上传的文件。但是,我收到 NullPointerException 并且我无法理解其背后的原因。任何建议都会很棒!
收到的错误信息:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference
at com.example.studyshotsv4.Upload.<init>(Upload.java:13)
at com.example.studyshotsv4.MainActivity$6.onSuccess(MainActivity.java:161)
at com.example.studyshotsv4.MainActivity$6.onSuccess(MainActivity.java:148)
at com.google.firebase.storage.StorageTask.lambda$new$0(com.google.firebase:firebase-storage@@16.0.4:125)
at com.google.firebase.storage.StorageTask$$Lambda$1.raise(Unknown Source:6)
at com.google.firebase.storage.TaskListenerImpl.lambda$onInternalStateChanged$2(com.google.firebase:firebase-storage@@16.0.4:94)
at com.google.firebase.storage.TaskListenerImpl$$Lambda$3.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:6986)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
下面是 MainActivity.java 中的 uploadFile() 方法:
private void uploadFile() {
if (mImageUri != null) {
StorageReference fileReference = mStorageRef.child(System.currentTimeMillis()
+ "." + getFileExtension(mImageUri)); //Unique file name
mUploadTask = fileReference.putFile(mImageUri)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mProgressBar.setProgress(0);
}
}, 500);
Toast.makeText(MainActivity.this, "Upload successful", Toast.LENGTH_LONG).show();
Upload upload = new Upload(mEditTextFileName.getText().toString().trim(),
taskSnapshot.getUploadSessionUri().toString()); // taskSnapshot.getStorage().getDownloadUrl().toString());
String uploadId = mDatabaseRef.push().getKey();
mDatabaseRef.child(uploadId).setValue(upload);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
})
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
mProgressBar.setProgress((int) progress);
}
});
} else {
Toast.makeText(this, "No file selected", Toast.LENGTH_SHORT).show();
}
}
上传类:
public class Upload {
private String mName;
private String mImageUrl;
public Upload() {
//empty constructor needed
}
//Constructor takes name and imageURL
public Upload(String name, String imageUrl) {
if (mName.trim().equals("")) {
name = "No Name";
}
mName = name;
mImageUrl = imageUrl;
}
//Get and set methods
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getImageUrl() {
return mImageUrl;
}
public void setImageUrl(String imageUrl) {
mImageUrl = imageUrl;
}
}
解决方案
从错误消息中可以清楚地看出,尝试在空对象引用上调用虚拟方法 'java.lang.String java.lang.String.trim()',您正在对空字符串使用 trim()。mName 尚未初始化,您正在使用 trim() 。也许你想要这个
public Upload(String name, String imageUrl) { //name parameter must not be null
if (name.trim().equals("")) {
name = "No Name";
}
mName = name;
mImageUrl = imageUrl;
}
推荐阅读
- python - 使用 Python 将 sys.stdout 写入多个日志文件?
- python - 如何根据 if 语句获取文件名?
- sql - 用于获取特定实例不存在于另一个表中的记录的 SQL 查询
- c# - 如何在 Windows 窗体中动态创建标签页内容?
- rxjs - rxjs中过滤的发送队列
- r - 在 IMDB 更改 URL 请求的性质
- c# - 使用 Semaphore Slim 限制线程数
- json - 从 PowerShell 中的另一个 JSON 文件读取后,在 JSON 中添加/附加新的键值对
- networking - 通过 Proxy VPN 服务器转发 websocket
- firebase - 同时调用的 Firestore 查询“onSnapshot”不起作用(