协程异常引发KotlinNullPointerException

时间:2020-01-07 15:23:37

标签: android firebase kotlin mvvm kotlin-coroutines

我正在从Firebase请求一个对象,但是在请求它之前,我检查是否存在活动的互联网连接以获取结果,我以此方式调用我的仓库

ViewModel

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 吗?

1 个答案:

答案 0 :(得分:2)

当您使用!!运算符强制进行可空类型的不安全类型对话时,可能会发生KotlinNullPointerException。这意味着对象e.cause实际上为空。您应该检查它是否为null,而不是盲目地假设它为非null。

相反,您应该做的是check the type异常类,以查看它是否与您在缺少网络连接的情况下所期望的异常相对应。