Java Firebase加密聊天应用程序运行时错误。从快照到字符串?

Java Firebase加密聊天应用程序运行时错误。从快照到字符串?,java,android,firebase,nullpointerexception,firebase-realtime-database,Java,Android,Firebase,Nullpointerexception,Firebase Realtime Database,我正在尝试接收字符串(消息)并对其进行加密,然后将其发送到firebase数据库。然后,当应用程序加载数据时,应向用户显示未加密的数据。因此,加密字符串位于服务器/数据库上 我收到nul指针异常,因为当您使用快照时,它似乎会调用默认消息构造函数,该构造函数不包含我调用的文本。本质上,datasnapshot调用默认构造函数,该构造函数不允许我在实际构造函数中调用对象的属性。这有什么关系吗 一旦应用程序请求将从数据库请求消息的方法,应用程序就会崩溃。在显示消息之前,我尝试从一串字节中解密消息。。。

我正在尝试接收字符串(消息)并对其进行加密,然后将其发送到firebase数据库。然后,当应用程序加载数据时,应向用户显示未加密的数据。因此,加密字符串位于服务器/数据库上

我收到nul指针异常,因为当您使用快照时,它似乎会调用默认消息构造函数,该构造函数不包含我调用的文本。本质上,datasnapshot调用默认构造函数,该构造函数不允许我在实际构造函数中调用对象的属性。这有什么关系吗

一旦应用程序请求将从数据库请求消息的方法,应用程序就会崩溃。在显示消息之前,我尝试从一串字节中解密消息。。。但是,这些消息将不会显示,应用程序将崩溃

这里有一个屏幕截图的链接

这是当登录成功并从数据库请求消息并显示它们时调用的方法(这一直有效,直到我搞砸了解密),我想从DB读取并解密,然后显示消息

   //READ DECRYPT AND DISPLAY THE MESSAGES
      mChildEventListener = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            //called when new message is inserted into the list  also 
            //triggered for every child message

           EncryptoMessage encryptoMessage = 
           dataSnapshot.getValue(EncryptoMessage.class);
            //get the text from the encryptomessage object store as string
            String encryptedString = encryptoMessage.getText();  //value of 
            //encryptedString ends up empty 

            byte [] bytes = encryptedString.getBytes();
            String str = null;
            try {
                 str = new EncryptoMessage().decrypt(bytes);
            } catch (Exception e) {
                e.printStackTrace();
            }
            EncryptoMessage decryptedMessage = new EncryptoMessage();
            decryptedMessage.setText(str);
            mMessageAdapter.add(decryptedMessage);
        }
这是来自用户输入的消息,已加密并以字符串形式存储在数据库中。我把btye[]转换成了字符串

      //SEND CLICKED
    // Send button sends a message and clears the EditText && Write to the 
    //Database
         mSendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // TODO: Send messages on click

            //get the message the user enters
          String messageText = mMessageEditText.getText().toString();

            byte[] codedtext = new byte[0];
            try {
                //take that message and encrypt it
                //codedtext now equal to byte array of messageText
                codedtext = new EncryptoMessage().encrypt(messageText);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //change the encrypted bytes into a string and send to the 
            //database
            String str = new String(codedtext, StandardCharsets.UTF_8);

            //Create an EncryptoMessage object for the message the user 
            //enters
            EncryptoMessage encryptoMessage = new EncryptoMessage(str, 
            mUsername, null);
            //add the new message object to the EncryptoChat database
            mMsgDatabaseReference.push().setValue(encryptoMessage);

            // Clear input box
            mMessageEditText.setText("");
        }
    });
这是加密的消息对象类(带加密)


它并不是空的。它是空的。这是不同的。您如何知道调用了默认构造函数?在encryptoMessage.java中没有Log语句,而是有一个构造函数。firebase快照函数默认使用此EncryptoMessage构造函数。如果没有快照,则无法使用快照。但是当我请求对象上的getText()时,结果是空的,就像你说的,你需要默认的构造函数,我只是问你为什么认为它被调用了。提示:其实问题出在setter方法上,为回复老兄干杯。什么是setter方法?你能告诉我哪里出了问题吗。我已经做了几个小时了:/你能用屏幕截图或导出JSON选项显示你的Firebase数据库吗?它不会变成空的。它是空的。这是不同的。您如何知道调用了默认构造函数?在encryptoMessage.java中没有Log语句,而是有一个构造函数。firebase快照函数默认使用此EncryptoMessage构造函数。如果没有快照,则无法使用快照。但是当我请求对象上的getText()时,结果是空的,就像你说的,你需要默认的构造函数,我只是问你为什么认为它被调用了。提示:其实问题出在setter方法上,为回复老兄干杯。什么是setter方法?你能告诉我哪里出了问题吗。我已经做了好几个小时了:/你能用屏幕截图或导出JSON选项显示你的Firebase数据库吗?
package com.google.firebase.david.encryptochat; //firebase API


import java.security.MessageDigest;
import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

//**************************************
//THis class is our message object
//*****************************************
public class EncryptoMessage {

private String text;
private String name;
private String photoUrl;

public EncryptoMessage() {

    // Default constructor required for calls to 
    //DataSnapshot.getValue(User.class)
  }

// The encrypto message constructor to create the object
public EncryptoMessage(String text, String name, String photoUrl) {
    this.text = text;
    this.name = name;
    this.photoUrl = photoUrl;
}
  //Copy constuctor

  /* public EncryptoMessage(EncryptoMessage EncryptoMessageCopy){
    this(EncryptoMessageCopy.getText(), EncryptoMessageCopy.getName());
}*/
public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPhotoUrl() {
    return photoUrl;
}

public void setPhotoUrl(String photoUrl) {
    this.photoUrl = photoUrl;
}


   //Encryption of the messages

   public byte[] encrypt(String message) throws Exception {
        final MessageDigest md = MessageDigest.getInstance("md5");

        final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
                .getBytes("utf-8"));

        final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
        for (int j = 0, k = 16; j < 8;) {
            keyBytes[k++] = keyBytes[j++];
        }

        final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
        final IvParameterSpec iv = new IvParameterSpec(new byte[8]);

        final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, iv);

        final byte[] plainTextBytes = message.getBytes("utf-8");
        final byte[] cipherText = cipher.doFinal(plainTextBytes);


        return cipherText;
       }
       //Decrypt

      public String decrypt(byte[] message) throws Exception {

        //get the bytes if the string passing in
        //byte [] bytes = message.getBytes();

        final MessageDigest md = MessageDigest.getInstance("md5");
        final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
                .getBytes("utf-8"));
        final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
        for (int j = 0, k = 16; j < 8;) {
            keyBytes[k++] = keyBytes[j++];
        }

        final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
        final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
        final Cipher decipher = 
        Cipher.getInstance("DESede/CBC/PKCS5Padding");
        decipher.init(Cipher.DECRYPT_MODE, key, iv);

        final byte[] plainText = decipher.doFinal(message);

        return new String(plainText, "UTF-8");
    }
 FATAL EXCEPTION: main
  Process: com.google.firebase.david.encryptochat, PID: 8733
  java.lang.NullPointerException: Attempt to invoke virtual method 'byte[] java.lang.String.getBytes()' on a null object reference
      at com.google.firebase.david.encryptochat.MainActivity$4.onChildAdded(MainActivity.java:238)