If you’re developing an Android app using Kotlin and encounter the dreaded kotlin.UninitializedPropertyAccessException: lateinit property ... has not been initialized, this guide will help you solve it with clear code examples and proper explanation. This error usually occurs when you declare a property using lateinit but forget to initialize it before accessing it. Here’s how to avoid and fix it in Android Studio.

1. What is lateinit in Kotlin?
The lateinit modifier in Kotlin is used to tell the compiler that a variable will be initialized later. It’s commonly used for non-null properties that are initialized after the object is created, such as in Activity or Fragment classes in Android.
private lateinit var myTextView: TextView
This allows you to avoid initializing it during declaration, but be careful — using it without proper initialization will crash the app.
2. The Error Explained
Error Message:
kotlin.UninitializedPropertyAccessException: lateinit property myTextView has not been initialized
Cause:
You are trying to access a lateinit variable before it has been assigned a value.
3. How to Fix It
Solution 1: Initialize Before Use
Make sure you are initializing the lateinit property in the appropriate lifecycle method.
MainActivity.kt:
class MainActivity : AppCompatActivity() {
private lateinit var myTextView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ✅ Correct initialization
myTextView = findViewById(R.id.textView)
myTextView.text = "Hello, Kotlin!"
}
}
Solution 2: Use :: to Check Initialization
Kotlin provides a way to check whether a lateinit variable has been initialized:
if (::myTextView.isInitialized) {
myTextView.text = "Initialized"
} else {
Log.d("MainActivity", "TextView is not initialized yet.")
}
Solution 3: Avoid lateinit When Not Needed
If possible, consider using nullable types (TextView?) or lazy initialization if the variable doesn’t need to be reassigned:
private val myTextView by lazy {
findViewById<TextView>(R.id.textView)
}
4. Best Practices
- Only use
lateinitwhen you’re 100% sure it will be initialized before any access. - Prefer
lazyfor single-assignment properties. - Use
::variable.isInitializedto check before accessing.
5. Bonus: Full Example with Proper Use
MainActivity.kt:
class MainActivity : AppCompatActivity() {
private lateinit var myButton: Button
private lateinit var myTextView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
myButton = findViewById(R.id.button)
myTextView = findViewById(R.id.textView)
myButton.setOnClickListener {
if (::myTextView.isInitialized) {
myTextView.text = "Button clicked!"
}
}
}
}
6. Additional Resource
You can also learn more from the Kotlin official documentation on lateinit.