Я создаю приложение для Firebase, где пользователь может оценить другого пользователя. Иногда я получаю нулевой указатель на такой код:
averageStars+=Double.parseDouble(rate.getRates());
Я, кажется, часто так запутываюсь, когда я создаю класс модели, а затем каким-то образом никогда не инициализирую его. Тем не менее, даже с некоторыми исследованиями, я не уверен, почему они не считаются инициализированными. Кто-нибудь есть идея о том, как я инициализировать классы, как это (Firebase). Мой основной код действия выглядит так:
public class RateActivity extends AppCompatActivity {
Button btnSubmit;
MaterialRatingBar ratingBar;
MaterialEditText edtComment;
FirebaseDatabase database;
DatabaseReference rateDetailRef;
DatabaseReference driverInformationRef;
double ratingStars= 0.0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rate);
database = FirebaseDatabase.getInstance();
rateDetailRef = database.getReference(Common.rate_detail_tbl);
driverInformationRef = database.getReference(Common.user_driver_tbl);
btnSubmit = (Button)findViewById(R.id.btnSumbit);
ratingBar = (MaterialRatingBar)findViewById(R.id.ratingBar);
edtComment = (MaterialEditText)findViewById(R.id.edtComment);
ratingBar.setOnRatingChangeListener(new MaterialRatingBar.OnRatingChangeListener() {
@Override
public void onRatingChanged(MaterialRatingBar ratingBar, float rating) {
ratingStars = rating;
}
});
btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
submitRateDetails(Common.driverId);
}
});
}
private void submitRateDetails(String driverId) {
SpotsDialog alertDialog = new SpotsDialog(this);
alertDialog.show();
Rate rate = new Rate();
rate.setRates(String.valueOf(ratingStars));
rate.setComments(edtComment.getText().toString());
rateDetailRef.child(Common.driverId)
.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.push()
.setValue(rate)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
rateDetailRef.child(Common.driverId)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
double averageStars = 0.0;
int count = 0;
for(DataSnapshot postSnapshot : dataSnapshot.getChildren())
{
Rate rate = postSnapshot.getValue(Rate.class);
averageStars+=Double.parseDouble(rate.getRates());
count++;
}
double finalAverage = averageStars/count;
DecimalFormat df = new DecimalFormat("#.#");
String valueUpdate = df.format(finalAverage);
Map<String,Object> driverUpdateRate = new HashMap<>();
driverUpdateRate.put("rates",valueUpdate);
driverInformationRef.child(Common.driverId)
.updateChildren(driverUpdateRate)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
alertDialog.dismiss();
Toast.makeText(RateActivity.this, "Thank you for your feedback", Toast.LENGTH_SHORT).show();
finish();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
alertDialog.dismiss();
Toast.makeText(RateActivity.this, "Rating did not go through", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
alertDialog.dismiss();
Toast.makeText(RateActivity.this,"Rating failed?",Toast.LENGTH_SHORT).show();
}
});
}
}
Мой класс модели для функции "getRates" выглядит так:
public class Rate {
private String rates;
private String comments;
public Rate(String rates, String comments) {
this.rates = rates;
this.comments = comments;
}
public Rate(){}
public String getRates() {
return rates;
}
public void setRates(String rates) {
this.rates = rates;
}
public String getComments() {
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
}
Спасибо. Из-за запроса вот мой logcat:
2020-01-26 17:59:25.792 25184-25184/com.example.usubx E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.usubx, PID: 25184
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1838)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at com.example.usubx.RateActivity$4$1.onDataChange(RateActivity.java:102)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.0:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.0:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.2.0:55)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Вот значение моего datasnapshot
DataSnapshot { key = RateDetails, value = {UE7cSOf5Thbum6OwEmg9seAPD463={-LzZH15-YVs1m67EuJlD={comments=Colin, rates=4.5}, -LzZHvuClxb5Ef3jk23_={comments=, rates=5.0}}, -LzJrTz5FrzEaoWorqP-={comments=, rates=5.0}, -LzKQn7F1ybKVAxUj9NX={comments=heck cool, rates=5.0}, -LzNyBwBh0tVHKvMfgEk={comments=, rates=5.0}, vAdqbIhLKJasOtyXKYrCkrOSVq33={-Lz-hH6TXxKTUVvIUYnK={comments=he was cool, rates=5.0}, -LzNz80QZDhnZA1tJ27Y={comments=, rates=3.5}, -Lz-h35N3l0xnLVVNvwa={comments=, rates=1.5}, -LzJqTWwUXOsfKPDZh2E={comments=, rates=5.0}, -LzNzEjdyg_aYMAfdI14={comments=, rates=5.0}, -LzJomtnZH4zJ6nddk0c={comments=HECK YES IT WORKS, rates=5.0}}, -LzJt7VA3iVPLopRFD34={comments=let's go, rates=5.0}, -LzNxj1zaWAZukLPyTEw={comments=, rates=5.0}, -LzNv9bTAz7_3vXioMRe={comments=heck, rates=5.0}} }