Исключение сопрограммы выдает исключение KotlinNullPointerException - PullRequest
0 голосов
/ 07 января 2020

Я запрашиваю объект из Firebase, но перед тем, как запросить его, я проверяю, есть ли активное соединение inte rnet, чтобы получить результаты, я называю свое репо следующим образом

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)
    }
}

Теперь, когда нет соединения inte rnet, исключение должно вернуться к моей модели представления, здесь я использую 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 (CoroutineSchlely 59) .scheduling.CoroutineScheduler.access $ runSafely (CoroutineScheduler.kt: 60) в kotlinx.coroutines.scheduling.CoroutineScheduler $ Worker.run (CoroutineScheduler. kt: 740)

Журнал ошибок указывает на эту строку в моей ViewModel

emit(Resource.Failure(e.cause!!))

Что я не понимаю, так это почему он дает KotlinNullPointerException, когда он должен обрабатывать Сообщение об исключении , которое я выдаю.

Кроме того, есть ли лучший способ перехватить любое исключение вместо Исключение в моей ViewModel?

1 Ответ

2 голосов
/ 07 января 2020

Исключение KotlinNullPointerException может возникать, когда вы вызываете небезопасный диалог типа обнуляемого типа с помощью оператора !!. Это означает, что объект e.cause фактически равен нулю. Вы должны проверить его на null вместо того, чтобы слепо предполагать, что он не равен null.

Вместо этого вы должны проверить тип класса исключения, чтобы увидеть, соответствует ли оно исключению, которое вы бы сделали ожидать в случае отсутствия сетевого подключения.

...