Kotlin:Init 函数和变量初始化

mar*_*337 6 android kotlin

我正在为我的应用程序构建一个组件,并且开始更频繁地使用init函数而不是构造函数,但现在发生了奇怪的事情。如果我在函数内部调用init函数来初始化列表,它会抛出NullPointerException该列表。函数是否init在特定类中初始化变量之前执行?

异常被抛出removeAllViews

代码:

init {
        createViews()
    }

    private var viewList = mutableListOf<ViewGroup>()
    private fun createViews(){
        removeAllViews()
        list.forEach { addItem(it) }
        changeViewsState(true)
    }

    private fun removeAllViews(){
        parent.removeAllViews()
        viewList.clear()
    }
Run Code Online (Sandbox Code Playgroud)

Sim*_*one 6

从本节获取官方文档:https://kotlinlang.org/docs/classes.html#constructors

在实例初始化期间,初始化程序块按照它们在类主体中出现的顺序执行,并与属性初始化程序交错。

因此,您应该将变量声明放在init

private var viewList = mutableListOf<ViewGroup>()

init {
    createViews()
}
private fun createViews(){
    removeAllViews()
    list.forEach { addItem(it) }
    changeViewsState(true)
}

private fun removeAllViews(){
    parent.removeAllViews()
    viewList.clear()
}
Run Code Online (Sandbox Code Playgroud)