📖 Scenario: Imagine you are writing a small Kotlin program that divides numbers. Sometimes, the divisor might be zero, which causes an error. You want to handle this safely without crashing the program.
🎯 Goal: You will build a Kotlin program that uses runCatching to safely execute a division operation and handle any errors gracefully.
📋 What You'll Learn
Create a function that divides two integers
Use runCatching to safely execute the division
Store the result or the error message
Print the final output showing success or failure
💡 Why This Matters
🌍 Real World
Handling errors safely is important in apps that deal with user input or external data, like calculators or data processors.
💼 Career
Many Kotlin jobs require writing robust code that does not crash on bad input. Using <code>runCatching</code> is a common way to handle exceptions cleanly.
Progress0 / 4 steps
1
Create a division function
Write a function called divide that takes two Int parameters named numerator and denominator. The function should return the result of dividing numerator by denominator as an Int.
Kotlin
Hint
Use the / operator to divide the two integers inside the function.
2
Use runCatching to safely execute division
Create a variable called result that uses runCatching to call the divide function with 10 as numerator and 0 as denominator.
Kotlin
Hint
Use runCatching { divide(10, 0) } to catch any exceptions from dividing by zero.
3
Extract success or failure message
Create a variable called message that uses result.fold to return the success value as a string or the failure exception message.
Kotlin
Hint
Use fold on result to handle both success and failure cases.
4
Print the final message
Write a println statement to display the message variable.
Kotlin
Hint
Use println(message) to show the result or error message.
Practice
(1/5)
1. What is the main purpose of runCatching in Kotlin?
easy
A. To execute code and catch exceptions safely without crashing the program
B. To run code only if a condition is true
C. To create a new thread for running code
D. To convert a value to a string safely
Solution
Step 1: Understand what runCatching does
runCatching runs a block of code and catches any exceptions that happen inside it.
Step 2: Identify the main purpose
This helps keep the program running smoothly by handling errors safely without crashing.
Final Answer:
To execute code and catch exceptions safely without crashing the program -> Option A
Quick Check:
runCatching = safe execution [OK]
Hint: runCatching catches errors to keep code safe [OK]
Common Mistakes:
Thinking runCatching runs code conditionally
Confusing runCatching with threading
Assuming it converts types automatically
2. Which of the following is the correct syntax to use runCatching in Kotlin?
easy
A. val result = runCatching -> someFunction()
B. val result = runCatching(someFunction())
C. val result = runCatching { someFunction() }
D. val result = runCatching.someFunction()
Solution
Step 1: Recall the syntax of runCatching
runCatching takes a lambda block with curly braces to run code safely.
Step 2: Match the correct syntax
val result = runCatching { someFunction() } uses curly braces and calls someFunction() inside, which is correct.
Final Answer:
val result = runCatching { someFunction() } -> Option C
Quick Check:
runCatching uses braces { } [OK]
Hint: Use curly braces {} to pass code block to runCatching [OK]
Common Mistakes:
Using parentheses instead of braces
Trying to call runCatching like a function with arrow
Accessing runCatching as an object
3. What will be the output of this Kotlin code?
val result = runCatching { 10 / 0 }
println(result.isSuccess)
medium
A. true
B. null
C. Exception thrown
D. false
Solution
Step 1: Analyze the code inside runCatching
The code tries to divide 10 by 0, which causes an exception (ArithmeticException).
Step 2: Understand runCatching result
runCatching catches the exception, so no crash happens. The isSuccess property will be false because the block failed.
Final Answer:
false -> Option D
Quick Check:
Exception caught means isSuccess = false [OK]
Hint: Divide by zero causes failure, so isSuccess is false [OK]
Common Mistakes:
Expecting true because code runs
Thinking exception is thrown outside runCatching
Confusing isSuccess with isFailure
4. Identify the error in this Kotlin code using runCatching:
val result = runCatching {
val number = "abc".toInt()
}
println(result.getOrNull())
medium
A. No error, prints null because conversion fails
B. Throws NumberFormatException outside runCatching
C. Syntax error in runCatching block
D. getOrNull() returns the string "abc"
Solution
Step 1: Understand the code inside runCatching
Trying to convert "abc" to Int causes NumberFormatException, but runCatching catches it.
Step 2: Check what getOrNull() returns
Since exception happened, getOrNull() returns null safely without crashing.
Final Answer:
No error, prints null because conversion fails -> Option A
Quick Check:
Exception caught means getOrNull() = null [OK]
Hint: runCatching catches exceptions, getOrNull returns null on failure [OK]
Common Mistakes:
Expecting exception to crash program
Thinking getOrNull returns original string
Assuming syntax error in code block
5. You want to safely parse a list of strings to integers using runCatching and collect only the successful results. Which Kotlin code snippet correctly does this?
hard
A. val numbers = list.map { runCatching { it.toInt() }.exceptionOrNull() }
B. val numbers = list.map { runCatching { it.toInt() }.getOrNull() }.filterNotNull()
C. val numbers = list.map { it.toInt() }.filter { it != null }
D. val numbers = list.map { runCatching { it.toInt() }.getOrThrow() }
Solution
Step 1: Understand the goal
We want to convert strings to integers safely, ignoring failures, and collect only successful integers.
Step 2: Analyze each option
val numbers = list.map { runCatching { it.toInt() }.getOrNull() }.filterNotNull() uses runCatching to catch exceptions, then getOrNull() returns integer or null, and filterNotNull() removes nulls, collecting only successful parses.
Final Answer:
val numbers = list.map { runCatching { it.toInt() }.getOrNull() }.filterNotNull() -> Option B