致命异常 java.lang.NullPointerException: null 不能转换为非 null 类型 kotlin.String

Posted

技术标签:

【中文标题】致命异常 java.lang.NullPointerException: null 不能转换为非 null 类型 kotlin.String【英文标题】:FATAL EXCEPTION java.lang.NullPointerException: null cannot be cast to non-null type kotlin.String 【发布时间】:2021-01-04 02:54:44 【问题描述】:

我尝试制作我的第一个应用程序,但我收到了错误消息。错误信息是:

2020-09-17 11:18:17.846 30034-30132/com.ibrahimkiceci.simplynoteapp W/i.simplynoteap: Accessing hidden method Lsun/misc/Unsafe;->getInt(Ljava/lang/Object;J)I (greylist, linking, allowed)

2020-09-17 11:18:18.017 30034-30034/com.ibrahimkiceci.simplynoteapp D/androidRuntime:关闭 VM 2020-09-17 11:18:18.020 30034-30034/com.ibrahimkiceci.simplynoteapp E/AndroidRuntime: 致命异常: main 进程:com.ibrahimkiceci.simplynoteapp,PID:30034 java.lang.NullPointerException: null 不能转换为非 null 类型 kotlin.String 在 com.ibrahimkiceci.simplynoteapp.ListViewActivity$getDataFromFirestore$1.onEvent(ListViewActivity.kt:114) 在 com.ibrahimkiceci.simplynoteapp.ListViewActivity$getDataFromFirestore$1.onEvent(ListViewActivity.kt:19) 在 com.google.firebase.firestore.Query.lambda$addSnapshotListenerInternal$2(Query.java:1142) 在 com.google.firebase.firestore.Query$$Lambda$3.onEvent(未知来源:6) 在 com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent$0(AsyncEventListener.java:42) 在 com.google.firebase.firestore.core.AsyncEventListener$$Lambda$1.run(未知来源:6) 在 android.os.Handler.handleCallback(Handler.java:883) 在 android.os.Handler.dispatchMessage(Handler.java:100) 在 android.os.Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java:7356) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 2020-09-17 11:18:18.086 30034-30034/com.ibrahimkiceci.simplynoteapp I/Process:发送信号。 PID:30034 SIG:9

当我点击我的登录按钮时,应用程序关闭,我共享代码屏幕,

我该如何解决?谢谢!

类 ListViewActivity : AppCompatActivity() 私有lateinit var auth:FirebaseAuth 私有lateinit var db:FirebaseFirestore

var titleTextFromFB : ArrayList<String> = ArrayList()
var imageFromFB : ArrayList<String> = ArrayList()
var adapter: NoteAdapter? = null


override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_list_view)

    auth = FirebaseAuth.getInstance()
    db = FirebaseFirestore.getInstance()

    getDataFromFirestore()

    // recyclerview

    var layoutManager = LinearLayoutManager(this)
    recyclerView.layoutManager = layoutManager
    adapter = NoteAdapter(titleTextFromFB, imageFromFB)

    recyclerView.adapter = adapter



override fun onCreateOptionsMenu(menu: Menu?): Boolean 

    val menuInflater = menuInflater
    menuInflater.inflate(R.menu.add_note, menu)

    return super.onCreateOptionsMenu(menu)


override fun onOptionsItemSelected(item: MenuItem): Boolean 

    if (item.itemId == R.id.add_note) 
        // Take Notes Activity
        val intent = Intent(applicationContext, TakeNotesActivity::class.java)
        startActivity(intent)

     else if (item.itemId == R.id.log_out) 

        val alert = AlertDialog.Builder(this)

        alert.setTitle("Log out")
        alert.setMessage("Are you sure to logout from the app ?")
        alert.setPositiveButton("Yes") dialog, which ->

            auth.signOut()
            val intent = Intent(applicationContext, MainActivity::class.java)
            startActivity(intent)
            finish()
        

        alert.setNegativeButton("No") dialog, which ->

        

        alert.show()


    


    return super.onOptionsItemSelected(item)


// get data from firestore

fun getDataFromFirestore() 

    db.collection("Notes").orderBy("date", Query.Direction.DESCENDING).addSnapshotListener  snapshot, exception ->

        if (exception != null) 

            // If there is a error ,

            Toast.makeText(applicationContext, exception.localizedMessage.toString(), Toast.LENGTH_LONG).show()


         else 

            if (snapshot != null) 

                if (!snapshot.isEmpty) 

                    val documents = snapshot.documents
                    for (document in documents) 

                        val userEmail = document.get("userEmail") as String
                        val noteTitle = document.get("noteTitle") as String
                        val yourNote = document.get("yourNote") as String
                        val downloadUrl = document.get("downloadUrl") as String
                        val timestamp = document.get("date") as Timestamp
                        val date = timestamp.toDate()

                        titleTextFromFB.add(noteTitle)
                        imageFromFB.add(downloadUrl)

                        adapter!!.notifyDataSetChanged()




                    
                
            


        


      



  





【问题讨论】:

你能把堆栈跟踪或行号粘贴到问题出现的地方吗?您也可以检查自己,如果此代码 sn-p 中的任何字符串值是否为 null,如果为 null,则在变量声明中添加 ? 运算符。 我粘贴了堆栈跟踪,我还检查了所有的 null 和?操作员,但看起来没问题,否则我错过了一些东西 查看行号114,那边写的是什么? 当我点击时,它会转到 Query 并向我显示以下代码: QuerySnapshot querySnapshot = new QuerySnapshot(this, snapshot, firestore); userListener.onEvent(querySnapshot, null); ; 如果没有,您是否使用某些IDE进行开发,然后在记事本中打开或其他显示行号的IDE,您在第114行有错误,您能告诉那行是什么吗?从代码中并不清楚确切的行是什么。 【参考方案1】:

据我了解,您的错误是从此代码块生成的:

val userEmail = document.get("userEmail") as String
val noteTitle = document.get("noteTitle") as String
val yourNote = document.get("yourNote") as String
val downloadUrl = document.get("downloadUrl") as String

这里来自document 的变量之一是null,它不能在kotlin 中转换为不可为空的String 类型。

如果您不确定哪些字段可以为空,请编写如下代码:

val userEmail : String? = document.get("userEmail") as? String
val noteTitle : String?  = document.get("noteTitle") as? String
val yourNote : String? = document.get("yourNote") as? String
val downloadUrl : String? = document.get("downloadUrl") as? String

为了更清楚,请检查Safe(nullable)-Cast kotlin 中的运算符docs

【讨论】:

欢迎您,如果您认为这解决了您的问题,请接受并投票。 不,它不能解决我的问题。但是再次感谢您的关注,当我找到解决方案时,我将从这里分享【参考方案2】:

当我删除并重新安装我的数据库时,问题就解决了。

【讨论】:

【参考方案3】:

在你的 for 循环中

for (document in documents) 

                    val userEmail = document.get("userEmail") as String
                    val noteTitle = document.get("noteTitle") as String
                    val yourNote = document.get("yourNote") as String
                    val downloadUrl = document.get("downloadUrl") as String
                    val timestamp = document.get("date") as Timestamp
                    val date = timestamp.toDate()

                    titleTextFromFB.add(noteTitle)
                    imageFromFB.add(downloadUrl)

                    adapter!!.notifyDataSetChanged()




                

一个(或多个)字段为空,您正试图将它们转换为非空字符串对象!所以在这种情况下,kotlin 会抛出运行时异常。 你应该把它转换成字符串?而不是字符串: 像这样:

val field = document.get("field") as String?

或检查它的可空性:

val field = if (document.get("field") != null) document.get("field") as String
    else ""

【讨论】:

以上是关于致命异常 java.lang.NullPointerException: null 不能转换为非 null 类型 kotlin.String的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不断收到此空指针未知来源错误?

无法向 Kafka 集群生成 PubNub 数据流

获取“致命异常 AsyncTask #1”

获取 Android 运行时:致命异常

片段中的Android致命异常

致命异常主要android