Deep Kotlin tutorial covering nullable types, non-null types, compiler checks, null handling with examples, diagram, mistakes, and interview answers.
Nullable and Non-null Types
What is Nullable and Non-null Types?
Nullable and Non-null Types is an important Kotlin topic from 1.2 Immutability, Null Safety, and Type System. In this lesson we focus only on the concepts that belong together: nullable types, non-null types, compiler checks, null handling. This keeps the lesson deep enough for interviews but not mixed with unrelated ideas.
Why students should learn it
- Understand Nullable and Non-null Types in simple language
- Use nullable types in real Kotlin or Android code
- Explain Nullable and Non-null Types in interviews with examples and trade-offs
How it works
Nullable and Non-null Types: nullable types, non-null types, compiler checks, null handling works through Kotlin's type system. The compiler uses type information to warn you before runtime. When the type says a value may be missing, changing, or unknown because it came from Java, your code must handle that explicitly.
- Identify what problem Nullable and Non-null Types: nullable types, non-null types, compiler checks, null handling solves.
- Write the smallest Kotlin snippet that demonstrates it.
- Add one Android or JVM use case where it matters.
- Compare it with a similar concept so the difference is clear.
- Finish by naming one common mistake and the safer alternative.
Interview tip: keep the answer simple first, then add example, trade-off, and mistake.
Types / Classification
- nullable types: core concept in this lesson
- non-null types: core concept in this lesson
- compiler checks: core concept in this lesson
- null handling: core concept in this lesson
- Non-null type: value should exist
- Nullable type: value can be missing
- Safe access: handles absence
- Unsafe access: may crash
Important differences
| Concept 1 | Concept 2 | How to remember it |
|---|---|---|
| String | String? | String is expected to exist; String? must be checked. |
| val | immutable object | val protects reassignment; immutable object protects internal state. |
| ?. | !! | ?. is safe; !! crashes if value is null. |
| Unit | Nothing | Unit means a function returns, just with no useful value; Nothing means the function never returns normally at all. |
Diagram
flowchart TD
A["1.2 Immutability, Null Safety, and Type System"] --> B["Nullable and Non-null Types"]
B --> C["Why it exists"]
C --> D["How it works in Kotlin"]
D --> E["Android or JVM example"]
E --> F["Mistakes and interview answer"]
Examples
Safe nullable handling
fun displayName(name: String?): String {
return name?.trim()?.takeIf { it.isNotEmpty() } ?: "Guest"
}
val is not deep immutability
val names = mutableListOf("Asha")
names.add("Riya") // object still changes
When to use it
Use it when: Use nullable types whenever a value can genuinely be absent - an optional profile photo, a search result that might not exist, a network call that failed.
Avoid it when: Avoid marking everything nullable "just in case" - it pushes null checks everywhere and hides which values are actually guaranteed to exist.
Common mistakes
- Using !! to silence compiler warnings
- Thinking val makes a mutable object immutable
- Trusting Java platform types without checks
- Returning null when a sealed result would explain failure
- Smart-casting mutable properties that can change
Interview questions
Read each answer in four parts: simple answer, code example, trade-off, and common mistake.
1. What is Nullable and Non-null Types in 1.2 Immutability, Null Safety, and Type System?
Answer: Nullable and Non-null Types is an important Kotlin topic from 1.2 Immutability, Null Safety, and Type System. In this lesson we focus only on the concepts that belong together: nullable types, non-null types, compiler checks, null handling. This keeps the lesson deep enough for interviews but not mixed with unrelated ideas.
fun displayName(name: String?): String {
return name?.trim()?.takeIf { it.isNotEmpty() } ?: "Guest"
}- Trade-off: String and String? solve related but different problems: String is expected to exist; String? must be checked.
- Common mistake: Using !! to silence compiler warnings
2. How does Nullable and Non-null Types work in Kotlin or Android code?
Answer: Nullable and Non-null Types: nullable types, non-null types, compiler checks, null handling works through Kotlin's type system. The compiler uses type information to warn you before runtime. When the type says a value may be missing, changing, or unknown because it came from Java, your code must handle that explicitly.
val names = mutableListOf("Asha")
names.add("Riya") // object still changes- Trade-off: String and String? solve related but different problems: String is expected to exist; String? must be checked.
- Common mistake: Thinking val makes a mutable object immutable
3. What is one common mistake with Nullable and Non-null Types?
Answer: A common mistake is: Using !! to silence compiler warnings Another is: Thinking val makes a mutable object immutable
fun displayName(name: String?): String {
return name?.trim()?.takeIf { it.isNotEmpty() } ?: "Guest"
}- Trade-off: String and String? solve related but different problems: String is expected to exist; String? must be checked.
- Common mistake: Using !! to silence compiler warnings
4. How would you explain Nullable and Non-null Types with a small example?
Answer: Nullable and Non-null Types is an important Kotlin topic from 1.2 Immutability, Null Safety, and Type System. In this lesson we focus only on the concepts that belong together: nullable types, non-null types, compiler checks, null handling. This keeps the lesson deep enough for interviews but not mixed with unrelated ideas. Here is a short example that shows it in practice.
fun displayName(name: String?): String {
return name?.trim()?.takeIf { it.isNotEmpty() } ?: "Guest"
}- Trade-off: String and String? solve related but different problems: String is expected to exist; String? must be checked.
- Common mistake: Thinking val makes a mutable object immutable
5. What is the trade-off of using Nullable and Non-null Types?
Answer: String and String? solve related but different problems: String is expected to exist; String? must be checked.
val names = mutableListOf("Asha")
names.add("Riya") // object still changes- Trade-off: String and String? solve related but different problems: String is expected to exist; String? must be checked.
- Common mistake: Using !! to silence compiler warnings
Practice task
Write one Kotlin example for Nullable and Non-null Types. Then explain it using: what is it, how it works, where it is used, mistake to avoid, and one interview answer.