iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Kotlin】java.util.NoSuchElementException: List is empty

先日、Kotlin で Firestore を用いて Collection を取得していると下記のような Error に遭遇しました👀

2020-12-13 11:42:44.547 22551-22551/com.YamatoOtaka.androidsample1 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.YamatoOtaka.androidsample1, PID: 22551
    java.util.NoSuchElementException: List is empty.
        at kotlin.collections.CollectionsKt___CollectionsKt.first(_Collections.kt:212)
        at com.YamatoOtaka.androidsample1.HomeFragment$getCountries$1.onSuccess(HomeFragment.kt:103)
        at com.YamatoOtaka.androidsample1.HomeFragment$getCountries$1.onSuccess(HomeFragment.kt:17)
        at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

2020-12-13 11:42:44.547 22551-22608/com.YamatoOtaka.androidsample1 W/Firestore: (22.0.0) [WatchStream]: (311a0d6) Stream closed with status: Status{code=UNAVAILABLE, description=Unable to resolve host firestore.googleapis.com, cause=java.lang.RuntimeException: java.net.UnknownHostException: Unable to resolve host "firestore.googleapis.com": No address associated with hostname
        at io.grpc.internal.DnsNameResolver.resolveAll(DnsNameResolver.java:436)
        at io.grpc.internal.DnsNameResolver$Resolve.resolveInternal(DnsNameResolver.java:272)
        at io.grpc.internal.DnsNameResolver$Resolve.run(DnsNameResolver.java:228)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor

....

どうやら、オフライン時に下記のように it.documents.first() でドキュメントを取得しようとしていたのが問題だったらしく、firstOrNull() に修正したところラインタイムエラーの発生はなくなりました。Kotlin の Collction に対する first() は Swift と異なりオプショナルではないので、注意が必要ということですね😢

        FirebaseFirestore.getInstance()
            .collection("countries")
            .get()
            .addOnSuccessListener {
                val hoge = it.documents.first()

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com