【错误记录】Kotlin 代码运行时报错 ( 在 init 初始化块中调用还未初始化的成员属性 )

news/2023/6/7 0:06:05

文章目录

  • 一、报错信息
  • 二、问题分析
  • 三、解决方案


该问题的本质就是 , 成员属性 在 init 初始化代码块中进行初始化 , 但是在初始化之前调用了该 成员属性 , 编译时没有报错信息 , 但是运行时会报异常 ;





一、报错信息



执行如下代码 :

class Hello {var name: Stringfun nameFirstLetter() = name[0]init {println(nameFirstLetter())name = "Tom"}
}fun main() {Hello()
}

执行结果 :

Exception in thread "main" java.lang.NullPointerExceptionat Hello.nameFirstLetter(Hello.kt:3)at Hello.<init>(Hello.kt:5)at HelloKt.main(Hello.kt:11)at HelloKt.main(Hello.kt)Process finished with exit code 1

上述代码在编译时 , 没有报错 ;

在这里插入图片描述





二、问题分析



从 初始化 角度分析 上述代码的执行顺序 , Kotlin 类 对象在实例化 时会执行一系列的 初始化操作 , 这些操作按照如下顺序执行 :

  • 主构造函数 中属性赋值
  • 类中的属性赋值
  • init 初始化块 中的代码执行
  • 次构造函数 中的代码执行

首先 , 上述代码中没有主构造 函数 , 因此该项忽略 ;

然后 , 执行属性的赋值 , 代码中定义了 name 属性 , 但是没有进行赋值 ;

var name: String

再后 , 执行 init 初始化块 , 其中先执行 nameFirstLetter 函数 , 在该函数中调用了 fun nameFirstLetter() = name[0] 中的 name 属性 , 但是 name 属性还没有赋值 , 因此爆出了空指针异常 ;

    init {println(nameFirstLetter())name = "Tom"}

该问题的本质就是 , 成员属性 在 init 初始化代码块中进行初始化 , 但是在初始化之前调用了该 成员属性 , 编译时没有报错信息 , 但是运行时会报异常 ;





三、解决方案



调换 初始化代码块 中的代码顺序 , 先给 name 成员赋值 , 然后再执行 调用 name 成员的方法 ;

class Hello{var name: Stringfun nameFirstLetter() = name[0]init {name = "Tom"println(nameFirstLetter())}
}fun main() {Hello()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4556073.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

18对个人财富的窥视——对一款手机木马的解读及分析

今年的3.15晚会异常精彩,网络安全不再离我们那么遥远,智能硬件漏洞、淘宝刷单等已经开始影响我们的生活,如果您不懂网络安全专业知识,没有关系,但必须得有安全意识和安全常识,经常听到周围很多朋友的朋友被骗**万,什么手机短信诈骗,什么冒充公检法欺诈,什么冒充家长转…

你被窥视了吗?清醒看移动应用程序隐私保护

位于华盛顿特区的智囊团——未来隐私论坛&#xff0c;本周发布的一份研究详细说明了在2012年6月&#xff0c;移动应用的隐私保护政策的状态。该报告发现&#xff0c;在移动应用的隐私保护问题上&#xff0c;许多应用程序开发商&#xff0c;正在面对日益加大的来自美国监管机构的…

从 “求最大公约数” 窥视数学,编程和算法

算法&#xff0c;讲究一个巧字: 最近一直在研究算法的内容&#xff0c;但是我发现了一个问题&#xff0c;那就是在学习的时候会有一种迷茫的感觉&#xff0c;有时候会分不清编程和算法的关系&#xff0c;有时候会分不清算法和数学的关系&#xff0c;在这里贴出一些我的小感悟&a…

网络管理必备工具软件精解(Windows版)---转载及个人见解

网络管理必备工具软件精解(Windows版)出版社: 人民邮电出版社作者: 刘晓辉 王淑江出版日期:2006年3月国标编号:ISBN 7-115-14546条形码: 字数:899千字  印张&#xff1a;28.25 印数: 1-5000 页码: 443 开本:787*1092版别版次&#xff1a;2006年3月第1版第1次印刷内容提…

Hyper-V三种虚拟网络类型的理解

Windows 10除家庭版之外都内置了Hyper-V&#xff0c;但是Win10系统上Hyper-V虚拟网络的设置方法却与之前版本的Hyper-V有些不同&#xff0c;最近在折腾了无数遍之后&#xff0c;总算有些心得&#xff1a;先说说虚拟网络的三种类型。Hyper-v支持外部、内部、专用三种网络&#x…

我们的工作方式:窥视Envato Tuts +团队的生活

今天&#xff0c;我们为您提供一个机会&#xff0c;在Envato Tuts 的后台进行幕后探访&#xff0c;并结识为您带来所有这些教程和课程的编辑。 我们是21世纪的一支庞大的员工队伍&#xff1a;遍布全球&#xff0c;在家工作&#xff0c;工作时间完全不同&#xff0c;并通过Trel…

java基础理论学习笔记(1)——volatile

首先借用阳哥的脑图&#xff1a; 1、轻量级&#xff1a;是相对jvm的三个特性&#xff0c;volatile只实现了可见性、有序性来说的。 2、可见性&#xff1a; 如下图:线程工作时&#xff0c;会从堆中&#xff08;主内存&#xff09;里拷贝变量age25到各自栈中&#xff08;工作内…

灵遁者油画作品《窥探》

灵遁者油画作品《窥探》。尺寸&#xff1a;7070cm 百科说&#xff1a;人性狭义上是指人的本质心理属性&#xff0c;也就是人之所以为人的那一部分属性&#xff0c;是人与其它动物相区别的属性&#xff1b;广义上是指人普遍所具有的心理属性&#xff0c;其中包括人与其它动物所共…