In Kotlin, the safe call operator (?.
) is used to handle nullable types safely. It ensures that the property or method is accessed only if the value is non-null, avoiding the possibility of a NullPointerException
.
Here’s how it works:
Syntax and Usage:
The ?.
operator allows you to safely access a property or call a method on an object that could be null. If the object is null, the entire expression will evaluate to null, instead of throwing a NullPointerException
.
Examples:
1. Accessing Properties:
val name: String? = null
val length = name?.length // Safe call, will return null because name is null
println(length) // Output: null
2. Calling Methods:
val nullableString: String? = "Hello"
println(nullableString?.toUpperCase()) // Output: "HELLO"
val nullString: String? = null
println(nullString?.toUpperCase()) // Output: null
3. Chaining Safe Calls:
You can chain multiple safe calls to handle deeply nested nullable types.
data class Address(val city: String?)
data class User(val address: Address?)
val user: User? = User(Address("New York"))
println(user?.address?.city) // Output: "New York"
val nullUser: User? = null
println(nullUser?.address?.city) // Output: null
4. Using with let
:
You can combine the safe call operator with the let
function to perform an action if the value is not null.
val name: String? = "Kotlin"
name?.let {
println("The length of the name is ${it.length}")
}
// Output: The length of the name is 6
5. Elvis Operator (?:
) for Default Values:
You can use the safe call operator with the Elvis operator (?:
) to provide a default value when the expression evaluates to null.
val name: String? = null
val length = name?.length ?: 0 // If name is null, use default value 0
println(length) // Output: 0
Key Points:
- Avoids
NullPointerException
: The?.
operator prevents unsafe access to null objects. - Returns null if the object is null: The chain will break and return null if any part of the chain is null.
- Useful for concise and readable code: It eliminates the need for explicit null checks.
By using the safe call operator, you can effectively and concisely handle nullable types in your Kotlin code.