Что выведет код 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 ошибок.