0

I am trying to save an Image-Url in my database "User", in addition to other attributes. When I upload the image and do changes in another EditText, it works perfectly fine. But when I try to edit fields without uploading a new image, it crashes with the following error:

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
                    // ...
                }
            });
    }
}

I tried to catch the error with the if-statements, but it did not work.

Doug Stevenson
  • 297,357
  • 32
  • 422
  • 441
Leon Stelzer
  • 31
  • 1
  • 7
  • The error suggests that one of your references was null on which you called toString(). Possibly it's the imageurl reference. This part of your code seems fine even if the error occurs here. can you perhaps show this whole file? – Afridi Kayal Jan 17 '20 at 15:06

1 Answers1

4

I gess the NPE happend before your "if" protection , on this line :

final String image = imageurl.toString();

You can prevent call to potential null value of imageurl variable using

final String image = imageurl != null ? imageurl.toString() : null;

From now, if imageurl is null, image will also be set to null but it won't raise any exception. Therefore , you should remove your if (image == null) { check wich is not necessary here.

Note this solution use the "ternary operator", check java documentation if you're not familiar with it : https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.25

Xavier D
  • 3,364
  • 1
  • 9
  • 16