You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 01:09:28