首页 > 解决方案 > java.lang.NullPointerException:火力基地

问题描述

好的,我将尝试一点一点地慢慢解释我的错误。

  1. 我有一个根据你的教程制作的移动应用程序。我看了视频并做到了。然后我纠正并改进了错误。

  2. 通过类比您的教程,完成了写问题的功能。一切似乎都运行良好,没有任何问题。一切正常..我收集了一个有效的 APK。我觉得这很酷。

  3. 我的数据库中有很多额外的东西:Testuser1、testuser2 等等。我去把它们都删了。首先在实时数据库中删除它,然后在 Firestore 中。但是,在删除时,我不小心触摸了文档中的某些消息。

  4. 现在我在一个新应用程序中遇到错误,该应用程序的工作时间早于 APK 和一周前的版本。

  5. 错误:java.lang.NullPointerException:尝试在空对象上调用虚拟方法 'com.google.firebase.database.ChildEventListener com.google.firebase.database.Query.addChildEventListener(com.google.firebase.database.ChildEventListener)'参考

firebaseRecyclerAdapter1.startListening();

我已经为这个问题苦苦挣扎了至少 2 天,我写信给许多主题社区,技术支持都没有成功。错误不在我的 java 代码中,而是在我在 Firebase 中的 misklik 中。我想在我的情况下创建一个丢失的文档。

我已经尝试过重新创建应用程序、传递 debag 等,但都无济于事。

我的数据结构是 Firebase 实时数据库:[![我的数据结构是 Firebase 实时数据库:][1]][1]

以防万一,这是我的简化活动的代码:

public class MessageActivity extends AppCompatActivity {
 
    private static final int PICK_IMAGE = 1;
    RecyclerView recyclerView;
    ImageView imageView;
    ImageButton sendbtn, cambtn, back;
    TextView username, typingtv;
    EditText messageEt;
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference rootref1, rootref2, typingref;
    MessageMember messageMember;
    Boolean typingchecker = false;
    String receiver_name, receiver_uid, sender_uid, url;
    Uri uri;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_message);
 
 
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
            url = bundle.getString("u");
            receiver_name = bundle.getString("n");
            receiver_uid = bundle.getString("ruid");
            sender_uid = bundle.getString("suid");
        } else {
            Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
        }
 
        messageMember = new MessageMember();
        recyclerView = findViewById(R.id.rv_message);
        cambtn = findViewById(R.id.cam_sendmessage);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(MessageActivity.this));
        imageView = findViewById(R.id.iv_message);
        messageEt = findViewById(R.id.messageet);
        sendbtn = findViewById(R.id.imageButtonsend);
        username = findViewById(R.id.username_messageTv);
 
        Picasso.get().load(url).into(imageView);
        username.setText(receiver_name);
 
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
 
 
        if (user != null) {
            sender_uid = user.getUid();
            if (receiver_uid != null && sender_uid != null) {
 
                rootref1 = database.getReference("Message").child(sender_uid); //getReference("Message")
                rootref2 = database.getReference("Message").child(receiver_uid); //getReference("Message")
 
            }
 
        }
 
        sendbtn.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.N)
            @Override
            public void onClick(View view) {
                SendMessage();
            }
        });
 
        cambtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(intent, PICK_IMAGE);
            }
        });
 
 
        messageEt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
 
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {  }
 
            @Override
            public void afterTextChanged(Editable editable) { }
        });
 
 
    }
 
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
 
 
        if (requestCode == PICK_IMAGE || resultCode == RESULT_OK ||
                data != null || data.getData() != null) {
            uri = data.getData();
 
            String url = uri.toString();
            Intent intent = new Intent(MessageActivity.this, SendImage.class);
            intent.putExtra("u", url);
            intent.putExtra("n", receiver_name);
            intent.putExtra("ruid", receiver_uid);
            intent.putExtra("suid", sender_uid);
            startActivity(intent);
 
 
        } else {
            Toast.makeText(this, "no file selected", Toast.LENGTH_SHORT).show();
        }
 
    }
 
    @Override
    protected void onStart() {
        super.onStart();
 
 
        if (rootref1 != null) {
            FirebaseRecyclerOptions<MessageMember> options1 =
                    new FirebaseRecyclerOptions.Builder<MessageMember>()
                            .setQuery(rootref1, MessageMember.class)
                            .build();
 
            FirebaseRecyclerAdapter<MessageMember, MessageViewHolder> firebaseRecyclerAdapter1 =
                    new FirebaseRecyclerAdapter<MessageMember, MessageViewHolder>(options1) {
                        @Override
                        protected void onBindViewHolder(@NonNull MessageViewHolder holder, int position, @NonNull MessageMember model) {
 
                            holder.Setmessage(getApplication(), model.getMessage(), model.getTime(), model.getDate(), model.getType(),
                                    model.getSenderuid(), model.getReceiveruid(), model.getSendername(), model.getAudio(), model.getImage());
 
 
                        }
 
 
                        @NonNull
                        @Override
                        public MessageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                            View view = LayoutInflater.from(parent.getContext())
                                    .inflate(R.layout.message_layout, parent, false);
 
                            return new MessageViewHolder(view);
                        }
                    };
 
            firebaseRecyclerAdapter1.startListening();
           recyclerView.setAdapter(firebaseRecyclerAdapter1);
 
        }
    }
 
    @RequiresApi(api = Build.VERSION_CODES.N)
    private void SendMessage() {
 
        String message = messageEt.getText().toString();
 
        Calendar cdate = Calendar.getInstance();
        SimpleDateFormat currentdate = new SimpleDateFormat("dd-MMMM-yyyy");
        final String savedate = currentdate.format(cdate.getTime());
 
        Calendar ctime = Calendar.getInstance();
        SimpleDateFormat currenttime = new SimpleDateFormat("HH:mm:ss");
        final String savetime = currenttime.format(ctime.getTime());
 
        String time = savedate + ":" + savetime;
 
        if (message.isEmpty()) {
            Toast.makeText(this, "Unable to send empty message", Toast.LENGTH_SHORT).show();
        } else {
            messageMember.setDate(savedate);
            messageMember.setTime(savetime);
            messageMember.setMessage(message);
            messageMember.setReceiveruid(receiver_uid);
            messageMember.setSenderuid(sender_uid);
            messageMember.setType("t");
 
            String id = rootref1.push().getKey();
            rootref1.child(id).setValue(messageMember);
 
            String id1 = rootref2.push().getKey();
            rootref2.child(id1).setValue(messageMember);
 
            messageEt.setText("");
 
        }
    }
}

标签: javaandroidfirebase-realtime-database

解决方案


解决了。解决了这个问题后,我为有类似问题的人准备了几个答案。在撰写答案时,我的解决方案已经运行了超过 2 周。

1是最简单的,它可以工作。实时删除 Firebase 数据库。再次创建 JSON 文件并将其再次附加到应用程序。它帮助了我,但只是暂时的。

2-执行彻底的调试,特别是检查到 Firebase 的数据传输。从用户那里获取信息。在 FB 中获取信息


推荐阅读