简体   繁体   English

How to fix java.lang.ClassCastException: java.lang.Class cannot be cast to java.util.Map

[英]How to fix java.lang.ClassCastException: java.lang.Class cannot be cast to java.util.Map

I'm using this code to detect if a value has changed on my firebase real-time database, but i got this error:我正在使用此代码检测 firebase 实时数据库上的值是否已更改,但出现此错误:

java.lang.ClassCastException: java.lang.Class cannot be cast to java.util.Map java.lang.ClassCastException: java.lang.Class cannot be cast to java.util.Map

    val ref = FirebaseDatabase.getInstance().reference.child("Users")
    ref.addChildEventListener(object : ChildEventListener {
        override fun onCancelled(p0: DatabaseError) {
            TODO("Not yet implemented")
        }

        override fun onChildMoved(p0: DataSnapshot, p1: String?) {
            TODO("Not yet implemented")
        }

        @SuppressLint("LongLogTag")
        override fun onChildChanged(dataSnapshot: DataSnapshot, p1: String?) {
            collectData(dataSnapshot.value as Map<String?, Any?>?)
        }

        override fun onChildAdded(dataSnapshot: DataSnapshot, s: String?) {
        }

        override fun onChildRemoved(p0: DataSnapshot) {
            TODO("Not yet implemented")
        }
    })

the collectData function collectData function

fun collectData(docs: Map<String?, Any?>?){
    doctorsArrayList.clear()
    if (docs != null) {
        for ((_, value) in docs) {
            //Get user map
            val singleUser =
                value as Map<*, *>
            //Get phone field and append to list
                doctorsArrayList.add(Doctors(
                    singleUser["name"] as String?,
                    "","",
                    singleUser["lastDate"] as String?,
                    singleUser["phoneNumber"] as String? ,
                    singleUser["muid"] as String?,
                    singleUser["speciality"] as String?,
                    singleUser["status"] as Boolean?)
                )
        }
        val myrv = findViewById<RecyclerView>(R.id.docRV)
        val myAdapter = DoctorsRV(this, doctorsArrayList)
        myrv.layoutManager = GridLayoutManager(this, 1)
        myrv.adapter = myAdapter
    }
}

STACK TRACE堆栈跟踪

> java.lang.ClassCastException: java.lang.String cannot be cast to
> java.util.Map
>         at packageName.doctor.DoctorsList.collectData(DoctorsList.kt:39)
>         at packageName.doctor.DoctorsList$onCreate$2.onChildChanged(DoctorsList.kt:87)
>         at com.google.firebase.database.core.ChildEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.3.0:82)
>         at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.3.0:63)
>         at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.3.0:55)
>         at android.os.Handler.handleCallback(Handler.java:907)
>         at android.os.Handler.dispatchMessage(Handler.java:99)
>         at android.os.Looper.loop(Looper.java:223)
>         at android.app.ActivityThread.main(ActivityThread.java:7478)
>         at java.lang.reflect.Method.invoke(Native Method)
>         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
>         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)

Help me please, thank you请帮帮我,谢谢

This exception can happen in two places:此异常可能发生在两个地方:

  1. dataSnapshot.value is different of null and isn't a Map . dataSnapshot.value不同于 null 并且不是Map
  2. value as Map<*, *> isn't a Map . value as Map<*, *>的值不是Map

Before trying to convert a value to a Map you need to check if it is a Map and if not, handle this case appropriately.在尝试将值转换为 Map 之前,您需要检查它是否是 Map,如果不是,请适当处理这种情况。

EDIT:编辑:

You can use the as?你可以使用as? operator which returns null on a failure to cast: https://kotlinlang.org/docs/reference/typecasts.html?&_ga=2.160730555.728369396.1590324399-1451069023.1560810152#safe-nullable-cast-operator operator which returns null on a failure to cast: https://kotlinlang.org/docs/reference/typecasts.html?&_ga=2.160730555.728369396.1590324399-1451069023.1560810152#safe-nullable-cast-operator

You're already checking when the first cast results in null in if (docs != null) .您已经在if (docs != null)中检查第一次转换何时导致 null 。 Now you need to do the same for the second case, that is, execute doctorsArrayList.add only if singleUser is different of null .现在您需要对第二种情况执行相同的操作,即仅当singleUsernull不同时才执行doctorsArrayList.add ArrayList.add。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.ClassCastException:无法将java.lang.Boolean强制转换为java.util.Map - java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.util.Map java.lang.ClassCastException:java.lang.String 无法转换为 java.util.Map - java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map java.lang.ClassCastException: java.util.HashMap$EntrySet 不能转换为 java.util.Map$Entry - java.lang.ClassCastException: java.util.HashMap$EntrySet cannot be cast to java.util.Map$Entry Solr CloudSolrClient:原因:java.lang.ClassCastException:java.lang.String无法转换为java.util.Map - Solr CloudSolrClient : Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map java.lang.ClassCastException:无法在Firebase Realtime数据库中将java.util.ArrayList强制转换为java.util.Map - java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map in Firebase Realtime database 如何修复“java.lang.ClassCastException:类 java.util.LinkedHashMap 无法转换为类”错误? - How to fix 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class' error? java.lang.ClassCastException:无法将java.lang.Class强制转换为java.lang.reflect.ParameterizedType - java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 如何修复:java.lang.ClassCastException:java.util.ArrayList无法强制转换为java.lang.Integer - How to fix: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Integer Hive Generic UDF: Hive does not cast as expected, Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map - Hive Generic UDF : Hive does not cast as expected, Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map 如何解决这个java.lang.ClassCastException:[B不能强制转换为java.util.List - How to fix this java.lang.ClassCastException: [B cannot be cast to java.util.List
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM