Что выведет код Senior Flow, StateFlow и SharedFlow обновлено
catch и onCompletion
Вопрос
Что выведет код? По строке на каждый вывод.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
flow {
emit(1)
throw IllegalStateException("boom")
}
.onCompletion { cause -> println("completed: ${cause?.message}") }
.catch { e -> println("caught ${e.message}"); emit(-1) }
.collect { println(it) }
println("end")
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: 1, completed: boom, caught boom, -1, end. Первое значение доходит до коллектора.
Что выведет
1
completed: boom
caught boom
-1
end
Разбор
Первое значение доходит до коллектора. Затем билдер бросает исключение. onCompletion стоит выше catch и видит причину завершения boom. Следом catch перехватывает ошибку и эмитит запасное значение -1, которое собирается. Поток завершился нормально, поэтому выполняется end.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.