首页 > 解决方案 > 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;
    }
}

标签: javaandroidfirebasefirebase-realtime-database

解决方案


从错误消息中可以清楚地看出,尝试在空对象引用上调用虚拟方法 '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;
}

推荐阅读