Как правильно инициализировать значение из firebase с классом модели - PullRequest
0 голосов
/ 27 января 2020

Я создаю приложение для 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}} }

Ответы [ 2 ]

1 голос
/ 27 января 2020

Я согласен с другим ответом, что достаточно просто поставить null, чтобы разобраться с этим случаем. Однако, исходя из вашего вопроса, похоже, что вы хотите инициализировать класс Rate значениями по умолчанию, чтобы в любой момент времени вы не получили недопустимые / нулевые значения. В этом случае я бы предложил изменить методы получения класса Rate следующим образом.

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() {
        if (rates == null) return "0.0";
        else return rates;
    }

    public void setRates(String rates) {
        this.rates = rates;
    }

    public String getComments() {
        if (comments == null) return ""; // Return empty string
        else return comments;
    }

    public void setComments(String comments) {
        this.comments = comments;
    }
} 

Надеюсь, это поможет!

0 голосов
/ 27 января 2020

Поскольку ваша база данных имеет ноль ставки. Пожалуйста, проверьте вашу базу данных. некоторые данные не имеют строки ставок.

и отметьте пустым, как это, чтобы избежать исключения NullPointerException

if(rate.getRates() != null)
    averageStars+=Double.parseDouble(rate.getRates());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...