错误记录Kotlin 代码运行时报错 ( 成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误记录Kotlin 代码运行时报错 ( 成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 )相关的知识,希望对你有一定的参考价值。
文章目录
该问题的本质就是 , 成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 ;
一、报错信息
执行下面的代码 :
class Hello(_age: Int)
var name: String = initName()
var age = _age
fun initName() = "Tom $age"
fun main()
var h = Hello(18)
println(h.name)
得到的结果是 :
Tom 0
在上述代码的构造函数中 , 传入了 _age 临时变量值为 18 , 给 age 赋值 18 , 但是最终打印出来的数据为 0 ;
二、问题分析
Kotlin 类 对象在实例化 时会执行一系列的 初始化操作 , 这些操作按照如下顺序执行 :
- 主构造函数 中属性赋值
- 类中的属性赋值
- init 初始化块 中的代码执行
- 次构造函数 中的代码执行
在下面的代码中 ,
class Hello(_age: Int)
var name: String = initName()
var age = _age
fun initName() = "Tom $age"
首先 , 主构造函数 中 只提供了一个临时变量 _age , 没有对成员属性赋值 ;
然后 , 开始对 类中的属性赋值 , 先给 name 属性赋值 , 该赋值调用了 initName 函数 , 在该函数中调用了 age 成员属性 , 但是此时 age 属性还没有赋值 , 使用的是默认值 0 ; 之后才对 age 进行赋值 ;
因此最终打印出的 name 结果是 Tom 0
;
三、解决方案
成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 ;
调换 age 属性与 name 属性的顺序 , 先对 age 进行赋值 , 即可得到想要的结果 ;
class Hello(_age: Int)
var age = _age
var name: String = initName()
fun initName() = "Tom $age"
fun main()
var h = Hello(18)
println(h.name)
执行结果 :
Tom 18
以上是关于错误记录Kotlin 代码运行时报错 ( 成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 )的主要内容,如果未能解决你的问题,请参考以下文章
错误记录Kotlin 代码运行时报错 ( 成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 )
错误记录Kotlin 代码运行时报错 ( 成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 )
错误记录Kotlin 代码编译时报错 ( Variable ‘name‘ must be initialized | 初始化块定义在所有属性之后 )
错误记录Kotlin 代码编译时报错 ( Variable ‘name‘ must be initialized | 初始化块定义在所有属性之后 )
错误记录Android Studio 编译时 Kotlin 代码编译报错 ( Not enough information to infer type variable T )
错误记录Visual Studio 2019 中运行 Unity C# 脚本时报错 ( 根据解决方案, 可能需要安装额外的组件才能获得 | .NET 桌面开发 | 使用 Unity 的游戏开发 )