📖 Scenario: Imagine you are building a simple calculator app that divides two numbers. Sometimes, the user might enter zero as the divisor, which causes an error. We want to handle this error in a clean way using Kotlin's Result type.
🎯 Goal: You will create a function that divides two numbers and returns a Result type to handle success or failure. Then, you will use this function and print the result or error message.
📋 What You'll Learn
Create a function called safeDivide that takes two Int parameters: numerator and denominator.
Inside safeDivide, return Result.success with the division result if the denominator is not zero.
If the denominator is zero, return Result.failure with an IllegalArgumentException and message "Cannot divide by zero".
Call safeDivide with numerator 10 and denominator 0, and store the result in a variable called result.
Use result.fold to print "Result: <value>" if successful, or "Error: <message>" if failure.
💡 Why This Matters
🌍 Real World
Handling errors without crashing apps is important in real-world software. Using <code>Result</code> helps manage errors clearly and safely.
💼 Career
Many Kotlin projects use <code>Result</code> or similar types for error handling. Knowing this helps you write robust code and work well in teams.
Progress0 / 4 steps
1
Create the safeDivide function
Write a function called safeDivide that takes two Int parameters named numerator and denominator. The function should return a Result<Int>.
Kotlin
Hint
Use the fun keyword to define the function with two Int parameters and return type Result<Int>.
2
Return success or failure inside safeDivide
Inside the safeDivide function, write an if statement to check if denominator is zero. If it is zero, return Result.failure(IllegalArgumentException("Cannot divide by zero")). Otherwise, return Result.success(numerator / denominator).
Kotlin
Hint
Use if (denominator == 0) to check for zero and return failure or success accordingly.
3
Call safeDivide and store the result
Call the safeDivide function with numerator 10 and denominator 0. Store the returned Result in a variable called result.
Kotlin
Hint
Use val result = safeDivide(10, 0) to call the function and save the result.
4
Print the result or error message using fold
Use result.fold to print the success value with "Result: <value>" or print the error message with "Error: <message>". Use println inside the lambdas.
Kotlin
Hint
Use result.fold(onSuccess = { ... }, onFailure = { ... }) to handle both cases and print messages.
Practice
(1/5)
1. What does the Kotlin Result type represent in functional error handling?
easy
A. A special type of exception thrown during errors
B. An object that holds either a success value or a failure exception
C. A function that always returns a Boolean
D. A list of all errors encountered during execution
Solution
Step 1: Understand the purpose of Result type
The Result type is designed to wrap either a successful outcome or an error, making error handling explicit and functional.
Step 2: Identify what Result holds
Result holds either a success value or a failure exception, not a list or a Boolean or an exception thrown directly.
Final Answer:
An object that holds either a success value or a failure exception -> Option B
Quick Check:
Result = success or failure [OK]
Hint: Result always wraps success or failure, not exceptions thrown [OK]
Common Mistakes:
Thinking Result is an exception type
Confusing Result with Boolean return
Assuming Result holds multiple errors
2. Which of the following is the correct way to create a successful Result object in Kotlin?
easy
A. Result.makeSuccess(value)
B. Result.ofSuccess(value)
C. Result.createSuccess(value)
D. Result.success(value)
Solution
Step 1: Recall the Kotlin Result API
Kotlin provides Result.success(value) to create a successful Result wrapping the value.
Step 2: Check method names
Only Result.success is the correct and existing method; others are invalid.
Final Answer:
Result.success(value) -> Option D
Quick Check:
Use Result.success() to wrap success [OK]
Hint: Use Result.success() to wrap success values [OK]
Common Mistakes:
Using non-existent methods like Result.ofSuccess
Confusing with factory methods
Trying to create Result with constructors
3. What will be the output of this Kotlin code?
val result = runCatching { 10 / 0 }
result.onSuccess { println("Success: $it") }
result.onFailure { println("Failure: ${it.message}") }
medium
A. Failure: / by zero
B. Success: 0
C. No output
D. RuntimeException thrown
Solution
Step 1: Understand runCatching behavior
runCatching executes the block and catches exceptions, wrapping them in Result.failure.
Step 2: Analyze division by zero
10 / 0 throws an ArithmeticException with message "/ by zero" which is caught and triggers onFailure.
Final Answer:
Failure: / by zero -> Option A
Quick Check:
Exception caught triggers onFailure [OK]
Hint: runCatching catches exceptions and calls onFailure [OK]
Common Mistakes:
Expecting program to crash with exception
Thinking onSuccess runs despite error
Ignoring exception message in output
4. Identify the error in this Kotlin code using Result for error handling:
fun divide(a: Int, b: Int): Result<Int> {
return try {
Result.success(a / b)
} catch (e: Exception) {
Result.failure(e)
}
}
val result = divide(10, 0)
result.onSuccess { println("Result: $it") }
.onFailure { println("Error: ${it.message}") }
medium
A. Cannot chain onSuccess and onFailure directly on Result
B. Should catch ArithmeticException instead of Exception
C. Result.failure should not be used inside catch block
D. No error, code works correctly
Solution
Step 1: Check chaining onSuccess and onFailure
In Kotlin, onSuccess and onFailure are extension functions returning Unit, so chaining them directly causes a compile error.
Step 2: Verify other parts
Try-catch with Result.success and Result.failure is correct; catching Exception is acceptable; Result.failure is valid.
Final Answer:
Cannot chain onSuccess and onFailure directly on Result -> Option A
Quick Check:
onSuccess and onFailure return Unit, no chaining [OK]
Hint: onSuccess/onFailure return Unit, cannot chain calls [OK]
Common Mistakes:
Trying to chain onSuccess and onFailure
Thinking catch block must catch ArithmeticException only
Misusing Result.failure inside catch
5. You want to write a Kotlin function that returns a Result wrapping the parsed integer from a string, or a failure if parsing fails. Which implementation correctly uses Result for this purpose?
hard
A. fun parseInt(str: String): Result<Int> = Result.failure(NumberFormatException())
B. fun parseInt(str: String): Result<Int> = Result.success(str.toIntOrNull() ?: throw NumberFormatException())
C. fun parseInt(str: String): Result<Int> = try { Result.success(str.toInt()) } catch (e: NumberFormatException) { Result.failure(e) }
D. fun parseInt(str: String): Int = str.toIntOrNull() ?: -1
Solution
Step 1: Understand the goal
The function should return Result wrapping success if parsing works, or failure if it throws NumberFormatException.
Step 2: Analyze each option
fun parseInt(str: String): Result<Int> = try { Result.success(str.toInt()) } catch (e: NumberFormatException) { Result.failure(e) } uses try-catch to wrap success or failure correctly. fun parseInt(str: String): Result<Int> = Result.success(str.toIntOrNull() ?: throw NumberFormatException()) throws exception outside Result.failure, breaking functional style. fun parseInt(str: String): Result<Int> = Result.failure(NumberFormatException()) always returns failure, ignoring input. fun parseInt(str: String): Int = str.toIntOrNull() ?: -1 returns Int, not Result.
Final Answer:
fun parseInt(str: String): Result<Int> = try { Result.success(str.toInt()) } catch (e: NumberFormatException) { Result.failure(e) } -> Option C
Quick Check:
Try-catch with Result.success/failure wraps parsing safely [OK]
Hint: Use try-catch with Result.success and Result.failure for safe parsing [OK]
Common Mistakes:
Throwing exceptions instead of wrapping in Result.failure
Returning plain Int instead of Result<Int>
Always returning failure ignoring input
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.