В сообщении об ошибке говорится, что у вас есть:
Попытка вызвать виртуальный метод 'java.lang.String java.lang.String.trim ()' для ссылки на пустой объект
Это означает, что где-то в вашем приложении какой-то код вызывает trim()
на null
.Поскольку в вашем коде нет вызовов trim
, вам нужно следить за трассировкой стека, чтобы увидеть, какой вызов в вашем коде действительно вызывает проблему.
И он говорит вам, что это происходит:
в sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1838)
в sun.misc.FloatingDecimal.parseDouble (FloatingDecimal.java:110)
в java.lang.Double.parseDouble (Double.java:539)
в com.example.nouraalqahtani.debrah2.accesssms $ 3.onDataChange (accesssms.java:304)
Теперь эта последняя строка - первая, которую вы можете распознать.Проблема возникает в строке 304 accesssms.java
.Вы можете проверить, какая именно строка находится в вашей IDE, но я упустил тот факт, что вы, очевидно, звоните parseDouble
по этой линии.Таким образом, проблема начинается с вызова parseDouble
.
Если я посмотрю на код, которым вы поделились, вы наберете parseDouble
в следующих двух строках:
String databa = dataSnapshot.child(bank).child("balance").getValue(String.class);
String am = dataSnapshot.child(bank).child("6").child("amount").getValue(String.class);
balance=Double.parseDouble(databa);
amount=Double.parseDouble(am);
Итак, проблемадолжен прийти из любого из этих рядов.В любом случае кажется вероятным, что вы получаете null
обратно от вызова к getValue(String.class)
, что означает, что либо нет значения в снимке, либо (менее вероятно), что значение не является строкой.
Трудно точно определить, какие данные вы слушаете, но насколько я вижу, вы инициализируете myRef
как:
myRef= FirebaseDatabase.getInstance().getReference("user_account").child(" .
(username)").child("bank_accounts");
Если это так,пожалуйста, сначала проверьте, что .
там не вызывает проблемы.
Если это действительно так, у вас есть ссылка на все банковские счета пользователя.Таким образом, если вы добавите ValueEventListener
к этой ссылке, ваш onDataChange
будет вызван с DataSnapshot
всеми банковскими счетами.Чтобы получить доступ к каждому отдельному банковскому счету, вам нужно перебрать дочерние узлы этого снимка.Что-то вроде:
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot accountSnapshot: dataSnapshot.getChildren()) {
String databa = accountSnapshot.child("balance").getValue(String.class);
String am = accountSnapshot.child("amount").getValue(String.class);
balance=Double.parseDouble(databa);
amount=Double.parseDouble(am);
...
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore errors
}
});