java.lang.ClassCastException:无法将java.lang.String强制转换为java.lang.Double

问题描述

我想在从数据库(实时Firebase)中检索一个值后再乘以一个值,然后分配给另一个变量。我试图这样做,但出现错误。有人可以帮我吗?

 private void getData(final TextView deliCha) {
        rootRef.child(appId).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                double distance = (double) dataSnapshot.child("distance").getValue();
                double charge = distance*100.0;
                deliCha.setText(String.valueOf(charge));
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

这是错误

    Process: com.example.ketomate,PID: 13156
    java.lang.classCastException: java.lang.String cannot be cast to java.lang.Double
        at com.example.ketomate.BillDetailsForPaymentAndDelivery$2.onDataChange(BillDetailsForPaymentAndDelivery.java:121)
        at com.google.firebase.database.Query$1.onDataChange(Query.java:179)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
        at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

解决方法

您可以使用Double.valueOf方法

double Distance = Double.valueOf (dataSnapshot.child("Distance").getValue());
,

在不查看数据库内容的情况下,我只能得出一个结论,即称为“ Distance”的子项的值是字符串值,而不是Double。您不能只将字符串转换为双精度字。

要做的第一件事是修复将值写入数据库的方式。不用编写String值,而是先将它们转换为double值,这样Firestore会将它们作为double值返回给您。

如果无法执行此操作,则在读取字符串时必须将其转换为双精度。

String distance = dataSnapshot.child("Distance").getValue(String.class);
double doubleDistance = Double.parseDouble(Distance);
double charge = doubleDistance * 100.0;
deliCha.setText(Double.toString(charge));

,

“ 6.016539公里”字符串不能转换为双精度字,因为它带有“公里”一词。首先,您需要先删除公里数一词,然后再转换为两倍。

/dev/input/mouse2