An extension function where the receiver type can be null, allowing you to call the function on nullable objects safely.
Click to reveal answer
beginner
How do you declare an extension function with a nullable receiver?
Use a question mark after the receiver type, for example: fun String?.myExtension() { ... }.
Click to reveal answer
beginner
Why are nullable receiver extensions useful?
They let you add functions that can be called on null objects without causing errors, making code safer and cleaner.
Click to reveal answer
intermediate
What happens if you call a nullable receiver extension on a null object?
The extension function runs, and inside it, the receiver is null, so you can handle that case safely.
Click to reveal answer
beginner
Example: What does this code print?
fun String?.printLength() {
if (this == null) println("Null string")
else println("Length: ${'$'}{this.length}")
}
fun main() {
val s: String? = null
s.printLength()
}
It prints: Null string because the receiver is null and the function checks for that.
Click to reveal answer
How do you declare an extension function with a nullable receiver in Kotlin?
Afun String.myFunc() { }
Bfun String.myFunc?() { }
Cfun ?String.myFunc() { }
Dfun String?.myFunc() { }
✗ Incorrect
The question mark goes after the receiver type: String?.
What is the receiver inside a nullable receiver extension when called on null?
AIt is null
BIt throws an exception
CIt is an empty string
DIt is a default value
✗ Incorrect
The receiver is null, so you can check for null inside the extension.
Why use nullable receiver extensions instead of normal extensions?
ATo override existing functions
BTo safely call functions on nullable objects without errors
CTo avoid using null checks outside
DTo make functions faster
✗ Incorrect
Nullable receiver extensions allow safe calls on null objects.
Which of these is a valid nullable receiver extension function signature?
Afun ?Int.isPositive() = this > 0
Bfun Int.isPositive?() = this > 0
Cfun Int?.isPositive() = this != null && this > 0
Dfun Int.isPositive() = this != null
✗ Incorrect
The question mark goes after the receiver type to make it nullable.
What will this expression evaluate to?
val s: String? = null
s?.length ?: -1
A-1
B0
Cnull
DThrows NullPointerException
✗ Incorrect
The safe call returns null, so the Elvis operator returns -1.
Explain what a nullable receiver extension is and why it is useful in Kotlin.
Think about calling functions on variables that might be null.
You got /3 concepts.
Write a simple Kotlin extension function with a nullable receiver and explain how it behaves when called on null.
Use fun String?.yourFunction() { ... }
You got /3 concepts.
Practice
(1/5)
1. What is the main benefit of using nullable receiver extensions in Kotlin?
easy
A. They prevent any null values from being assigned.
B. They make variables non-nullable automatically.
C. They convert nullable types to non-nullable types permanently.
D. They allow calling functions on nullable types without explicit null checks.
Solution
Step 1: Understand nullable receiver extensions
Nullable receiver extensions let you add functions to types that can be null, so you can call these functions safely without extra null checks.
Step 2: Identify the benefit
This means you can write cleaner code by calling functions directly on nullable objects without risking null pointer exceptions.
Final Answer:
They allow calling functions on nullable types without explicit null checks. -> Option D
Quick Check:
Nullable receiver extensions = call on nullable safely [OK]
Hint: Nullable extensions handle null inside function, no extra checks needed [OK]
Common Mistakes:
Thinking they convert nullable to non-nullable permanently
Assuming they prevent null assignments
Confusing with regular extensions on non-null types
2. Which of the following is the correct syntax to define a nullable receiver extension function isNullOrEmpty for String? in Kotlin?
easy
A. fun String.isNullOrEmpty(): Boolean = this == null || this.isEmpty()
B. fun String.isNullOrEmpty?(): Boolean = this == null || this.isEmpty()
C. fun String?.isNullOrEmpty(): Boolean = this == null || this.isEmpty()
D. fun String?.isNullOrEmpty?(): Boolean = this == null || this.isEmpty()
Solution
Step 1: Identify nullable receiver syntax
To define an extension on a nullable type, use String? as the receiver type with a question mark after the type name.
Step 2: Check function syntax
The function name should not have a question mark. So fun String?.isNullOrEmpty() is correct.
Final Answer:
fun String?.isNullOrEmpty(): Boolean = this == null || this.isEmpty() -> Option C
Quick Check:
Nullable receiver = question mark after type [OK]
Hint: Nullable receiver extension uses ? after type, not after function name [OK]
Common Mistakes:
Putting ? after function name instead of receiver type
Missing ? on receiver type for nullable
Using non-nullable receiver for nullable extension
3. What will be the output of the following Kotlin code?
fun String?.describe(): String = this ?: "Empty"
fun main() {
val text1: String? = "Hello"
val text2: String? = null
println(text1.describe())
println(text2.describe())
}
medium
A. Hello\nEmpty
B. Hello\nnull
C. null\nEmpty
D. Empty\nEmpty
Solution
Step 1: Understand the extension function behavior
The function returns the string itself if not null, otherwise returns "Empty".
Step 2: Apply to variables
text1 is "Hello", so describe() returns "Hello". text2 is null, so describe() returns "Empty".
Final Answer:
Hello\nEmpty -> Option A
Quick Check:
Nullable describe returns value or "Empty" [OK]
Hint: ?: operator returns left if not null, else right [OK]
Common Mistakes:
Assuming null prints as "null" string
Confusing ?: with !! operator
Expecting function to throw on null
4. Identify the error in this Kotlin code using a nullable receiver extension:
fun String?.firstChar(): Char = this[0]
fun main() {
val s: String? = null
println(s.firstChar())
}
medium
A. Compilation error: Extension function syntax incorrect
B. Compilation error: Cannot call get(0) on nullable receiver without null check
C. No error, prints first character or null
D. Runtime exception: NullPointerException when calling firstChar on null
Solution
Step 1: Analyze extension function code
The function calls this[0] on a nullable receiver String? without a null check or safe call.
Step 2: Understand compiler behavior
Kotlin compiler detects the unsafe access on nullable receiver and produces a compilation error.
Final Answer:
Compilation error: Cannot call get(0) on nullable receiver without null check -> Option B
Quick Check:
Unsafe access on nullable receiver = compile error [OK]
Hint: Nullable receiver extensions must check for null before use [OK]
Common Mistakes:
Assuming nullable receiver is auto-checked
Thinking it causes runtime exception instead of compilation error
Thinking it compiles and prints null instead of error
5. You want to create a nullable receiver extension safeLength() for String? that returns the string length or zero if null. Which implementation is correct and safe?
1) fun String?.safeLength() = this.length ?: 0
2) fun String?.safeLength() = this?.length ?: 0
3) fun String.safeLength() = this.length ?: 0
4) fun String?.safeLength() = if (this == null) null else this.length
hard
A. Option 2
B. Option 1
C. Option 3
D. Option 4
Solution
Step 1: Check each option for null safety
Option 1 calls this.length directly on nullable this, causing error. Option 3 uses non-nullable receiver, so not valid for nullable. Option 4 returns null instead of Int zero.
Step 2: Identify correct safe call usage
Option 2 uses safe call this?.length which returns length or null, then ?: 0 returns zero if null. This is safe and returns Int.
Final Answer:
fun String?.safeLength() = this?.length ?: 0 -> Option A
Quick Check:
Safe call ?. with ?: zero fallback is correct pattern [OK]
Hint: Use safe call ?. and ?: to handle nullable safely [OK]
Common Mistakes:
Calling length directly on nullable without safe call
Using non-nullable receiver for nullable extension
Returning null instead of zero for null input
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.