Quick Answer

Covering all possible cases

Understanding the Issue

When used as an expression (returning a value), Kotlin requires when to cover all possible cases for its subject. With sealed classes/enums, the compiler can verify exhaustiveness.

The Problem

This code demonstrates the issue:

Kotlin Error
// Problem: Non-exhaustive when
fun describe(number: Int) = when(number) {
    1 -> "One"
    2 -> "Two"
    // No else branch
}

The Solution

Here's the corrected code:

Kotlin Fixed
// Solution 1: Add else branch
fun describe(number: Int) = when(number) {
    1 -> "One"
    2 -> "Two"
    else -> "Other"
}

// Solution 2: Use sealed class
sealed class Result
class Success(val data: String) : Result()
class Error(val msg: String) : Result()

fun handle(result: Result) = when(result) {
    is Success -> "Success: ${result.data}"
    is Error -> "Error: ${result.msg}"
    // No else needed - compiler knows all cases
}

Key Takeaways

Ensure when expressions cover all cases or use sealed classes for type safety.