我正在从Firebase请求一个对象,但是在请求它之前,我检查是否存在活动的互联网连接以获取结果,我以此方式调用我的仓库
class ArtistsViewModel(private val repo: IArtists):ViewModel() {
val fetchArtistsList = liveData(Dispatchers.IO){
emit(Resource.Loading())
try {
val artistList = repo.getArtists()
emit(artistList)
}catch (e:Exception){
Crashlytics.logException(e.cause)
emit(Resource.Failure(e.cause!!))
}
}
}
class ArtistsRepoImpl : ArtistsRepo {
override suspend fun getArtists(): Resource<MutableList<Artist>> {
val artistList = mutableListOf<Artist>()
if(InternetCheck.isInternetWorking()){
val resultList = FirebaseFirestore.getInstance()
.collection("artists")
.get().await()
}else{
throw Exception("No internet connection")
}
return Resource.Success(artistList)
}
}
现在,当没有互联网连接时,异常应该返回到我的视图模型,这是我使用throw Exception("No internet connection")
传播异常的地方,但是现在在我的ViewModel上我收到了此消息
kotlin.KotlinNullPointerException在 com.presentation.viewmodel.ArtistsViewModel $ fetchArtistList $ 1.invokeSuspend(ArtistsViewModel.kt:22) 在 kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 在kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)在 kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594) 在 kotlinx.coroutines.scheduling.CoroutineScheduler.access $ runSafely(CoroutineScheduler.kt:60) 在 kotlinx.coroutines.scheduling.CoroutineScheduler $ Worker.run(CoroutineScheduler.kt:740)
错误日志指向我的ViewModel中的这一行
emit(Resource.Failure(e.cause!!))
我不明白的是为什么它在应该处理我抛出的 Exception 消息时给出KotlinNullPointerException
。
还有,还有一种更好的方法来捕获任何异常,而不是在我的ViewModel上捕获 Exception 吗?
答案 0 :(得分:2)
当您使用!!
运算符强制进行可空类型的不安全类型对话时,可能会发生KotlinNullPointerException。这意味着对象e.cause
实际上为空。您应该检查它是否为null,而不是盲目地假设它为非null。
相反,您应该做的是check the type异常类,以查看它是否与您在缺少网络连接的情况下所期望的异常相对应。