首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在哪里初始化lateinit?给出错误"kotlin.UninitializedPropertyAccessException: lateinit属性db尚未初始化“

在Kotlin中,lateinit关键字用于延迟初始化属性。它允许我们在声明属性时不进行初始化,而是在使用之前进行初始化。然而,如果我们在使用未初始化的lateinit属性时,会抛出"kotlin.UninitializedPropertyAccessException: lateinit属性db尚未初始化"的错误。

要解决这个错误,我们需要确保在使用lateinit属性之前进行初始化。通常,我们可以在以下几个地方进行初始化:

  1. 在构造函数中初始化:如果属性是在类的构造函数中使用的,我们可以在构造函数中对其进行初始化。这样可以确保在使用属性之前进行初始化。
代码语言:txt
复制
class MyClass {
    lateinit var db: Database

    init {
        db = Database()
    }
}
  1. 在自定义的初始化方法中初始化:如果属性的初始化需要进行一些额外的逻辑处理,我们可以定义一个自定义的初始化方法,并在该方法中对属性进行初始化。
代码语言:txt
复制
class MyClass {
    lateinit var db: Database

    fun initialize() {
        db = Database()
    }
}
  1. 在属性的访问器方法中初始化:如果属性的初始化需要根据其他条件进行判断,我们可以在属性的访问器方法中进行初始化。
代码语言:txt
复制
class MyClass {
    lateinit var db: Database
        get() {
            if (!::db.isInitialized) {
                db = Database()
            }
            return field
        }
}

需要注意的是,无论我们选择哪种方式进行初始化,都必须在使用lateinit属性之前进行初始化,否则会抛出上述错误。

关于lateinit属性的更多信息,您可以参考腾讯云的Kotlin开发文档:Kotlin开发文档

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

浅谈Kotlin(六):lateinit、by lazy 使用

一、lateinit的使用 按Java的写法,此时即代表datas默认为null,但是因为Kotlin的非空机制,这里给出了两种选择,要不给一个初始值,要不增加lateInit修饰 则可以这么写:...*/ 也可以这么写: 表示我先不给一个初始值,编译期的时候也无需进行非空判断,后面我会找时机给他赋值 即late的作用为编译期检查时不要因为属性变量未被初始化而报错 lateinit var datas...:ArrayList 当然若在使用该变量的时候仍未给赋值,则会报错 Caused by: kotlin.UninitializedPropertyAccessException: lateinit...property datas has not been initialized lateinit使用限制: 只能用来修饰类属性,不能用来修饰局部变量, 只能用来修饰对象,不能用来修饰基本类型(因为基本类型的属性类加载后的准备阶段都会被初始化为默认值...时再进行初始化 打印结果: lazyParm初始化 lazyParm->aaa by lazy使用限制: 要求属性声明为val,即不可变变量,java中相当于被final修饰。

3.9K32
  • Kotlin:关键字之lateinit

    Kotlin中定义变量或者属性都是需要初始化值的,并且其都是private的,但是有些时候对于变量或者属性只需要声明,但是不需要初始化,则kotlin提供了lateinit关键字来实现: class...:Int = 0 } 从上图可以看出编辑器所出现的错误可以总结出在使用lateinit是需要注意的事项: lateinit 对应使用var来声明属性 lateinit 不可以修饰原始数据类型(byte...,char,short ,int,long,float,double) 也许有人会问到为什么为什么不可以修饰原始数据类型 对于对象类型,Kotlin使用 null 值,以标记 lateinit 属性尚未初始化...(我们可以尝试使用某种单独的标记,但是通过反射初始化字段时不会更新该标记,这是 lateinit 的主要用例)。...因此,仅对象类型的属性支持 lateinit 但是 lateinit 是一个坑,对于新手来说还是一个不小的坑 Kotlin 代码中慎用 lateinit 属性 这位作者解释的很清楚了 对于 Kotlin

    96320

    Kotlin 究竟该不该用 lateinit

    也有同学喜欢尽可能的用上它,把 lateinit 作为介于 nonnull 和 nullable 之间的一个状态:对象构造时为 null,某一个时刻被初始化后一直都是 nonnull,这样属性的不确定性便减少了...只要是符合以下条件,我就会使用 lateinit 修饰属性: 该属性在对象构造时无法初始化(缺少必要参数),某个阶段被初始化之后会一直使用。...Crash 的原因无非就一个:初始化 lateinit 属性之前调用了该属性。...对比 nullable 属性lateinit 属性会 crash,nullable 属性不会,且和 lateinit 属性加了初始化判断的效果一致。这种场景下 nullable 属性表现的更好。...Kotlin 的 UninitializedPropertyAccessException本质上和 Java 的空指针错误是一样的,都是错误的估计此处对象不可能为空导致的。

    2K20

    【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)

    = null 赋空值 ; ③ 非空变量 ( 引用类型 ) 使用 lateinit 修饰 ; ④ 抽象属性变量不初始化 ; 2 . !! 与 ? 修饰符 : 仅对于 可空类型 有效 , ?...; ② 延迟初始化 : 引用类型变量使用 lateinit 关键字修饰 , 延迟初始化时机 , 可以使用前进行初始化 ; 但是如果使用前没有初始化 , 执行时会报错 ; class Student()...不初始化情况 : 使用 lateinit 修饰的变量 , 但如果不初始化 , 那么调用肯定报错 , 但是报的是未初始化错误 ; 不初始化不是为空 , 但不能调用 ; IV . lateinit 关键字...判定需求 : 非空变量 由于存在 延迟初始化 , 那么调用该变量的时候 , 该变量有可能没有进行初始化 , 需要判定该变量是否初始化 ; 3 ....属性没有进行初始化 VI .

    2.5K20

    Kotlin中的延迟属性(lazy properties)

    Hello Hello 同步锁模式 防止对个线程同时初始化 默认情况下,对于 lazy 属性的求值是同步锁的(synchronized):该值只一个线程中计算,并且所有线程会看到相同的值。...,将对代理实例的引用存储类对象中,并为与委托实例一起使用的属性生成getter。...除了val之外,lateinit不能用于可空属性和Java原语类型(这是因为null用于未初始化的值);所以如果你需要在类中存在的支持字段,请使用lateinit; lateinit var可以从对象被看到的任何地方被初始化...如果您希望以预先未知的方式从外部初始化属性,请使用lateinit。...延迟属性Lazy 与 lateinit 使用总结 lateinit用于外部初始化:当需要外部资料通过调用方法初始化您的值时。

    3.4K30

    Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?

    Kotlin中,by lazy 和 lateinit 都是用于延迟初始化的手段,但它们各自有不同的用法和特点。下面详细讨论它们的作用和区别。...1. by lazy 作用: by lazy 是一种委托属性,用于延迟初始化一个只读属性属性第一次访问时才会被初始化,并且初始化操作只会执行一次。...作用: lateinit 是一种延迟初始化的关键字,用于延迟初始化一个 var 可变属性。...需要线程安全的初始化或者只单线程中操作。 lateinit 适用场景: 需要在构造方法之后初始化的可变属性。 需要在某个特定操作时才对属性进行赋值。...by lazy 更适合不可变的延迟初始化场合,而 lateinit 则适用于构造方法之后需要手动初始化的可变属性

    9110

    【Kotlin】类的初始化 ④ ( lateinit 延迟初始化 | ::属性名称.isInitialized 检查属性是否初始化 | lazy 惰性初始化 )

    文章目录 一、lateinit 延迟初始化 ( ::属性名称.isInitialized 检查属性是否初始化 ) 二、lazy 惰性初始化 一、lateinit 延迟初始化 ( ::属性名称.isInitialized...检查属性是否初始化 ) ---- 定义属性时 , 可以使用 lateinit 关键字 设置该属性的 延迟初始化 , 实例对象 创建时不进行初始化 , 使用该属性之前对其进行初始化即可 ; 对于...lateinit 延迟初始化属性 , 使用前可以执行 ::属性名称.isInitialized 检查 , 查看该属性是否进行了初始化操作 ; 代码示例 : class Hello{ lateinit...name 属性值为 Tom 二、lazy 惰性初始化 ---- lazy 惰性初始化属性初始化操作 是 提前定义好的 , 调用之前 自动进行初始化操作 , 如果不调用 , 则不进行初始化...(1000) // 调用 name 属性后, 才初始化 name 属性 println("name = ${hello.name}") } 执行结果 : 实例对象初始化完毕 初始化

    1.3K10

    Kotlin入门(22)适配器的简单优化

    lateinit的意思是延迟初始化,它放在var或者val前面,表示被修饰的变量属于延迟初始化属性,即使没有初始化也仍然是非空的。...}     //ViewHolder中的属性使用关键字lateinit延迟初始化     inner class ViewHolder {         lateinit var ll_item:...,无需单独构造,也无需手工初始化; 2、像getCount、getItem、getItemId这三个函数,仅仅返回简单运算的数值,可以直接用等号取代大括号; 3、对于视图持有者的内部控件,变量名称前面添加...lateinit,表示该属性为延迟初始化属性; 网格视图 在前面的列表视图一小节中,给出了Kotlin改写后的适配器类,通过关键字lateinit固然避免了麻烦的空校验,可是控件对象迟早要初始化的呀...}     //ViewHolder中的属性构造时初始化     inner class ViewHolder(val view: View) {         val ll_item: LinearLayout

    1.3K10

    Kotlin学习笔记(二)-程序结构(上 )

    [TOC] 前言 上节我们主要讲了Kotlin的数据类型,这节我们主要从程序结构,包括方法,类成员,运算符的角度去认识Kotlin 常量与变量 上一节我们已经用到了用val,var来修饰属性。...(这里标识的定义是随便写的,@A @ABC都可以) 成员方法和成员变量 这部分比较简单直接举例子: class X class B { // lateinit var a:Int //错误 不能再原始类型中使用...var x1: X // lateinit val x2: //错误 不可以 val 类似final 定义后别虚初始化 val x2: X by lazy {...(也叫Backing Field)只能在getter和setter才能访问到,更多详见理解Backing Field Kotlin建议val/var修饰的属性最好直接初始化或是构造方法中初始化,如果不可以就降级为局部变量...** lateinit延时初始化,不可以修饰val,不可以修饰基本数据类型(因为基本数据类型有默认值),理智使用lateinit否则会空指针 by lazy{} 可以修饰val

    61720

    Android面试题之Kotlin的几种常见的类

    初始化的顺序 主构造函数里声明的属性 类级别的属性赋值 init初始化块里的属性赋值和函数调用 次构造函数里的属性赋值和函数调用 延迟初始化 lateinit关键字用来延迟初始化 isInitialized...return "ccc" } lateinit和by lazy lateinit只修饰var,lazy修饰val lateinit var只能用来修饰类属性,不能用来修饰局部变量,并且只能用来修饰对象...,不能用来修饰基本类型(因为基本类型的属性类加载后的准备阶段都会被初始化为默认值)。...lateinit var让编译期检查时不要因为属性变量未被初始化而报错,也就是去掉了属性上的@NotNull修饰 by lazy后面的表达式只第一次调用时执行一次,后续只返回结果 by lazy可以使用于类属性或者局部变量...,调用方法函数时,一定要确保属性已经初始化完成 继承 默认不可继承,如果要开放,需要open关键字 可以被覆写的方法也要open关键字修饰 用 is 来判断类型,用as来手动转换类型,并且kotlin

    7210

    从源码角度分析 Kotlin by lazy 的实现

    Lazy 接口的 value 属性用于获取当前 Lazy 实例的延迟初始化值。一旦初始化后,它不得在此 Lazy 实例的剩余生命周期内更改。..._value 使用@Volatile注解标注,相当于 Java 中 使用 volatile 修饰 _value 属性。...但是,如果某个值已由另一个线程初始化,则将返回该值而不执行初始化。 总结 lateinit 修饰的变量也可以延迟初始化,但并不是不用初始化,它需要在生命周期流程中进行获取或者初始化。...lateinit和by lazy的区别: lateinit 只能用于修饰变量 var,不能用于可空的属性和 Java 的基本类型。 lateinit 可以在任何位置初始化并且可以初始化多次。...lazy 第一次被调用时就被初始化,以后调用该属性会返回之前的结果。

    1.5K30

    【Jetpack】使用 Room 框架访问 Android 平台 SQLite 数据库 ( 导入依赖 | 定义 Entity 实体类 | 定义 Dao 数据库访问对象接口 | 定义数据库实例类 )

    com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' } 导入依赖 导入依赖库区别 : 如果导入错误...* 不需要插入到数据库中 * 使用 @Ignore 注解修饰该属性字段 */ @Ignore lateinit var studentInfo: String...* 获取 数据库访问 对象 * 这是必须要实现的函数 */ abstract fun studentDao(): StudentDao 将该类设置成单例类 , 单例类对象初始化时...* 不需要插入到数据库中 * 使用 @Ignore 注解修饰该属性字段 */ @Ignore lateinit var studentInfo: String...RoomDatabase 数据库实例类 需要继承 RoomDatabase 抽象类 , 使用 @Database 注解修饰 该抽象类 ; 其中需要 定义 获取 数据库访问 对象 的抽象函数 ; 将该类定义成 单例类 , 单例对象初始化

    40330

    抱歉!不要用Java的语法思维来写Kotlin

    val是线程安全的,并且必须在定义时初始化,所以不需要担心 null 的问题。只需要注意 val 某些情况下也是可变的就行了。...很好用,但也有坑 访问未初始化lateinit 属性会导致 UninitializedPropertyAccessException。...let { println(it) } // 输出 A 并忽略 null } 还有一种常见的错误(放ide里面试试就知道什么错误了): private var a: String?...val属性-适用于private或internal,或者类型检查is/!is声明属性的同一模块中执行; 不适用于open的属性,或者具有自定义getter的属性!...var属性-不适用(因为该变量可随时被修改) 安全(可空)转换-操作符as为避免抛出异常,可用安全转换操作符 as?,失败时返回null val a: String? = b as?

    3K40
    领券