java - 尝试在空对象引用上调用虚拟方法 'java.lang.String android.net.Uri.toString()'

标签 java firebase firebase-storage

除了其他属性之外,我还尝试在数据库“用户”中保存图像网址。 当我上传图像并在另一个 EditText 中进行更改时,它工作得很好。 但是,当我尝试编辑字段而不上传新图像时,它崩溃并出现以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference

String userId;
ImageView user;
Uri imageurl;
StorageReference mStorageRef;
Button upload;
private StorageTask uploadtask;
private Bitmap compressor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.profilbearbeiten);

    fAuth = FirebaseAuth.getInstance();
    fStore = FirebaseFirestore.getInstance();
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    mStorageRef= FirebaseStorage.getInstance().getReference().child("Images");
    DatabaseReference reference = database.getReference();

    userId = fAuth.getCurrentUser().getUid();
    fullName = findViewById(R.id.tv_name);
    email    = findViewById(R.id.tvEmail);
    bestätigen = findViewById(R.id.btbestätigen);
    ort = findViewById(R.id.tv_address);
    telefonummer = findViewById(R.id.tvTel);
    interessen = findViewById(R.id.tvInt);
    beschreibung = findViewById(R.id.tvBesc);
    user = findViewById(R.id.User);
    upload = findViewById(R.id.upload);

    upload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(uploadtask != null && uploadtask.isInProgress()){
                Toast.makeText(ProfilBearbeiten.this, "Upload in Progress", Toast.LENGTH_SHORT).show();
            }else{
                fileuploader();
            }
        }
    });

    user.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    filechooser();
                                }
                            });

            bestätigen.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // get Information from Edit Text or fileuploader()
                    final String eemail = email.getText().toString().trim();
                    final String efullname = fullName.getText().toString();
                    final String eort = ort.getText().toString();
                    final String einteresssen = interessen.getText().toString();
                    final String ebeschreibung = beschreibung.getText().toString();
                    final String etelefonnummer = telefonummer.getText().toString();
                    final String image = imageurl.toString();

                    userId = fAuth.getCurrentUser().getUid();
                    DocumentReference documentReference = fStore.collection("users").document(userId);

                    //save edited Information in Database
                    if (image != null){
                        Map<String, Object> user = new HashMap<>();
                        user.put("Benutername", efullname);
                        user.put("EMail", eemail);
                        user.put("Ort", eort);
                        user.put("Interessen", einteresssen);
                        user.put("Beschreibung", ebeschreibung);
                        user.put("Telefonnummer", etelefonnummer);
                        user.put("Image", image);
                        documentReference.set(user);
                    }
                    if (image == null) {
                        Map<String, Object> user = new HashMap<>();
                        user.put("Benutername", efullname);
                        user.put("EMail", eemail);
                        user.put("Ort", eort);
                        user.put("Interessen", einteresssen);
                        user.put("Beschreibung", ebeschreibung);
                        user.put("Telefonnummer", etelefonnummer);

                        documentReference.set(user);
                    }

                    Intent intent = new Intent(ProfilBearbeiten.this, Profile.class);
                    startActivity(intent);
                }
            });
    DocumentReference documentReference = fStore.collection("users").document(userId);
    documentReference.addSnapshotListener(this, new EventListener<DocumentSnapshot>() {
        @Override
        public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
            fullName.setText(documentSnapshot.getString("Benutername"));
            email.setText(documentSnapshot.getString("EMail"));
            ort.setText(documentSnapshot.getString("Ort"));
            telefonummer.setText(documentSnapshot.getString("Telefonnummer"));
            interessen.setText(documentSnapshot.getString("Interessen"));
            beschreibung.setText(documentSnapshot.getString("Beschreibung"));
        }
    });
}

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode== 1 && resultCode==RESULT_OK && data != null && data.getData() != null){
        imageurl=data.getData();
        user.setImageURI(imageurl);
    }
}

private void filechooser(){
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent, 1);
}

private String getExtension(Uri uri) {
    ContentResolver cr = getContentResolver();
    MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
    return mimeTypeMap.getExtensionFromMimeType(cr.getType(uri));
}

private void fileuploader () {
        StorageReference Ref = mStorageRef.child(System.currentTimeMillis()+","+getExtension(imageurl));
    uploadtask = Ref.putFile(imageurl)
            .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    // Get a URL to the uploaded content
                    Toast.makeText(ProfilBearbeiten.this, "Image Uploaded", Toast.LENGTH_LONG).show();
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    // Handle unsuccessful uploads
                    // ...
                }
            });
    }
}

我尝试使用 if 语句捕获错误,但没有成功。

最佳答案

我猜 NPE 发生在你的“if”保护之前,在这一行:

final String image = imageurl.toString();

您可以使用

阻止调用 imageurl 变量的潜在 null
final String image = imageurl != null ? imageurl.toString() : null;

从现在开始,如果imageurl为null,image也将被设置为null,但不会引发任何异常。因此,您应该删除这里不需要的 if (image == null) { 检查。

请注意,此解决方案使用“三元运算符”,如果您不熟悉它,请检查 java 文档:https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.25

关于java - 尝试在空对象引用上调用虚拟方法 'java.lang.String android.net.Uri.toString()',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59789584/

相关文章:

java - Java中两个日期之间的天数差异?

ios - 将 cloud_firestore 添加到 pubspec Flutter 后,无法为模拟器构建应用程序

typescript - 从 firebase 检索用户配置文件数据并显示

firebase - 将Firestore数据过滤为仅包含当前用户信息

javascript - Firebase存储规则错误: unexpected identifier; function taken from documentation

java - 按标签搜索 FlickR 照片

java - preHandle 中除了 HandlerMethod 之外还有什么处理程序?

java - 如何安全地取消订阅 Kafka 中的主题

javascript - .mov 文件在 Firebase 中存储为文本

swift - 注册过程中 Firebase 数据无效