【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()