Unable to start activity ComponentInfo{..} : java.lang.NullPointerException. Firebase
Я попробую медленно по пунктам объяснить свою ошибку.
У меня есть мобильное Android приложение написанное на Java использующее Firebase Realtime Database
Выполнил функционал написания сообщения юзеру коикну на кнопку "Связаться" Вроде бы все отлично работает, нет никаких вопросов. Все работает. Собрал рабочий апк. Думал круто.
В моей базе данных было много лишнего: Testuser1, testuser2 и так далее. Я всех их пошел удалять. Удалил вначале в Realtime DB, затем в Firestore. Однако, удаляя я случайно задел что-то в документе Message.
Теперь я получаю ошибку в новом приложении, рабочем ранее АПК и версии недельной давности.
Сама Ошибка: **Unable to start activity ComponentInfo{.MessageActivity}: java.lang.NullPointerException: Can't pass null for argument 'pathString' in child() at harsh.github.m.MessageActivity.onCreate(MessageActivity.java:129):
rootref1 = database.getReference("Message").child(sender_uid).child(receiver_uid);
Бьюсь над проблемой не меньше 2х дней, писал во множество тематических сообществ, техподдержку все безуспешно. Ошибка заключается не в моем java коде, а моем мисклике в Firebase. Я хочу создать недостающий документ в моем случае.
Уже пробовал пересоздавать приложения, проходить дебагом и.т.д, но все безуспешно.
Структура моих данных Firebase Realtime Database:

На всякий случай вот код моей упрощенной активности:
public class MessageActivity extends AppCompatActivity {
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;
private static final int PICK_IMAGE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
back = findViewById(R.id.backspace);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Bundle bundle = getIntent().getExtras();
if (bundle != null){
url = bundle.getString("u");
receiver_name = bundle.getString("n");
receiver_uid = bundle.getString("uid");
}else {
Toast.makeText(this, "Пользователя не сущесвует", 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 (sender_uid != null && receiver_uid != null) {
rootref1 = database.getReference("Message").child(sender_uid).child(receiver_uid);
rootref2 = database.getReference("Message").child(receiver_uid).child(sender_uid);
}
}
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);
}
});
}
@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, "Файл не выбран", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onStart() {
super.onStart();
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, "Не удается отправить пустое сообщение", 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("");
}
}}
Ответы (1 шт):
РЕШЕНО. Решив проблему я подготовил пару ответов для людей со схожей проблемой. Мои решения работают недели 2+ на момент написания ответа.
1 - Самый простой, может сработать. Удалить Firebase Realtime DB. Пересоздать JSON файл и прикрепит его заново к приложению. Мне помогло, но лишь на время.
2 - Провести тщательно Debug, в особенности проверить ПЕРЕДАЧУ данных в Firebase. Взятие информации от пользователя. Принятие информации в FB.