空对象引用上的android firebase数据库java.lang.String java.lang.Object.toString()'

时间:2018-11-05 18:01:16

标签: java android firebase android-studio firebase-realtime-database

请在此帮助(面试之前)

我正在尝试上传图片,当它开始向上倾斜时,它崩溃了 并删除两个基本子级(图像,缩略图)

  

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

4 个答案:

答案 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 天时间修复相关的错误,最终找到了错误的参考名称。 我希望如果它可以帮助。 谢谢。