MeWrite Docs

UninitializedPropertyAccessException: lateinit property has not been initialized

Kotlinでlateinitプロパティが初期化前にアクセスされた場合に発生

概要

UninitializedPropertyAccessExceptionは、Kotlinでlateinit修飾子を付けたプロパティが初期化される前にアクセスされた場合に発生します。

エラーメッセージ

kotlin.UninitializedPropertyAccessException: lateinit property viewModel has not been initialized

原因

  1. 初期化前のアクセス: ライフサイクルの順序を考慮していない
  2. DIの失敗: 依存性注入が正しく行われていない
  3. テストでの初期化漏れ: モックやセットアップが不足

解決策

1. 初期化タイミングを確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// Android Activity
class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ここで初期化
        viewModel = ViewModelProvider(this)[MainViewModel::class.java]
    }

    // onCreate後に呼ばれるメソッドで使用
    fun onButtonClick() {
        viewModel.doSomething()  // OK
    }
}

2. isInitializedで確認

1
2
3
4
5
6
7
8
9
private lateinit var data: String

fun checkData() {
    if (::data.isInitialized) {
        println(data)
    } else {
        println("Not initialized")
    }
}

3. lazy委譲を使用

1
2
3
4
// lateinitの代わりにlazyを使用
private val viewModel: MainViewModel by lazy {
    ViewModelProvider(this)[MainViewModel::class.java]
}

4. nullableに変更

1
2
3
4
5
6
// lateinit var を nullable に
private var data: String? = null

fun getData(): String {
    return data ?: "default"
}

5. Dagger/Hiltで確実に注入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var repository: UserRepository

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // @AndroidEntrypointにより、ここでは既に注入済み
        repository.getUsers()
    }
}

6. テストでの初期化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class MyTest {
    private lateinit var subject: MyClass

    @Before
    fun setup() {
        subject = MyClass()
    }

    @Test
    fun testSomething() {
        // subjectは初期化済み
        assertEquals(expected, subject.method())
    }
}

Kotlin の他のエラー

最終更新: 2025-12-09