在我的android项目中点击nullPointerExecption

时间:2019-05-28 20:47:05

标签: android firebase firebase-realtime-database nullpointerexception

嗨,我正在尝试制作一个聊天应用。在此过程中,IAM尝试检索存储在数据库中的消息,但IAM获取了一个Null Object引用异常。

我用来向数据库添加消息的代码是:

    img_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            String msg = text_send.getText().toString();
            if(!msg.equals(""))
                sendMessage(fuser.getUid(), currUserId, msg);
            else
                Toast.makeText(MessageActivity.this, "Enter Something", 
            Toast.LENGTH_SHORT).show();
         }
       });


  private void sendMessage(String sender,String receiver,String message)
  {
    DatabaseReference reference = 
    FirebaseDatabase.getInstance().getReference();
    HashMap<String,Object>hashMap = new HashMap<>();
    hashMap.put("sender",sender);
    hashMap.put("receiver",receiver);
    hashMap.put("message",message);

    reference.child("Chats").push().setValue(hashMap);

}

注意:以上代码部分工作正常。每次发送消息时,我的数据库都会正确更新。

在这部分之后,我尝试使用以下代码显示用户的消息

     DatabaseReference chatref = 
     FirebaseDatabase.getInstance().getReference().child("Chats");
     ArrayList<String> userchats = new ArrayList<>();

     listView = findViewById(R.id.listView);
     final ArrayAdapter <String> arrayAdapter = new ArrayAdapter<String> 
     (this,android.R.layout.simple_list_item_1,userchats);
     listView.setAdapter(arrayAdapter);

     chatref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, 
        @Nullable String s) {

            String value = dataSnapshot.getValue().toString();
            try {
                JSONObject object = new JSONObject(value);
                message = object.getString("message");
            }
            catch (JSONException e) {
                e.printStackTrace();
            }
            userchats.add(message);
            arrayAdapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, 
         @Nullable String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, 
        @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
        });

这时我运行该应用程序时,我得到了错误,并且我的堆栈跟踪如下:

         Process: com.kcw.firebasebasics, PID: 10943
         java.lang.NullPointerException: Attempt to invoke virtual method 
         'java.lang.String java.lang.Object.toString()' on a null object 
         reference at android.widget.ArrayAdapter.
         createViewFromResource(ArrayAdapter.java:401)
         at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369)
         at android.widget.AbsListView.obtainView(AbsListView.java:2346)
         at android.widget.ListView.makeAndAddView(ListView.java:1875)

最后是我的数据库图片:

picture of database

2 个答案:

答案 0 :(得分:1)

更改此:

String value = dataSnapshot.getValue().toString();

对此:

String value = dataSnapshot.child("message").getValue(String.class);

答案 1 :(得分:0)

您的chatref引用的“聊天”键巫婆不是字符串。这就是为什么你得到

  

在空对象上的'java.lang.String java.lang.Object.toString()'

您应该将dataSnapshot解析为类似此示例的类

Comment comment = dataSnapshot.getValue(Comment.class);

并且Comment类具有message receiver Sender变量

从Firebase文档中选中此Work with Lists of Data

最后,这是Firebase Android Codelab,展示了如何创建一个名为“友好聊天”的完整聊天应用