如何确定Kotlin中val的初始化顺序?为何FULLNAME会出现null值?
解决Kotlin中val初始化顺序导致的null值问题
1. 先排查最直接的拼写错误
你在a.b中定义的变量是val FISTNAME = "LINCON"(注意拼写少了字母R),但导入的却是FIRSTNAME——这会导致你实际引用的可能不是预期的变量。如果项目中存在另一个未初始化的FIRSTNAME(比如其他地方的lateinit var或未正确初始化的属性),就会出现null/aaron的结果。这是当前问题最可能的直接原因,先修正拼写,把a.b中的FISTNAME改为FIRSTNAME,确保导入和定义的变量名完全一致。
2. Kotlin中val的核心初始化规则
顶层属性(文件级val)
顶层属性会在其所在文件第一次被代码访问时初始化,遵循文件内从上到下的定义顺序。跨文件引用时,初始化顺序取决于哪个文件先被JVM加载:
- 如果
FULLNAME所在文件先被加载,而a.b.FIRSTNAME所在文件还未完成初始化,就可能拿到未初始化的值(不过普通顶层val默认是立即初始化的,除非用lazy修饰)。
类成员属性
- 主构造器中的属性在类实例化时立即初始化。
- 类体中的属性按定义顺序初始化,执行时机在主构造器完成后、次构造器执行前。
- 用
lazy修饰的属性会延迟到第一次被访问时才初始化,能避免跨依赖的初始化顺序问题。
3. 解决当前问题的具体方案
- 修正拼写错误:确保
a.b中的变量名是FIRSTNAME,与导入的名称一致,这是最优先要做的。 - 延迟初始化FULLNAME:如果跨文件的初始化顺序无法保证,把
FULLNAME改为lazy属性,确保它在第一次使用时才去获取FIRSTNAME的值,此时FIRSTNAME肯定已经完成初始化:import a.b.FIRSTNAME val FULLNAME by lazy { "$FIRSTNAME/aaron" } - 排查同名变量冲突:检查项目中是否有其他地方定义了
FIRSTNAME,导致导入错误或引用了未初始化的变量。
内容的提问来源于stack exchange,提问作者progquester
相关产品推荐
相关产品推荐

