首页
学习
活动
专区
工具
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修饰。

5.7K32
  • 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

    1K20

    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.7K20

    Kotlin中的延迟属性(lazy properties)

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

    3.5K30

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

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

    24310

    【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.6K10

    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.4K10

    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

    8610

    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

    63120

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

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

    1.6K30

    【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 注解修饰 该抽象类 ; 其中需要 定义 获取 数据库访问 对象 的抽象函数 ; 将该类定义成 单例类 , 在单例对象初始化时

    48430

    抱歉!不要用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

    写了多年的Java,直到看到Kotlin,原来代码可以如此优雅!

    val 是线程安全的,并且必须在定义时初始化,所以不需要担心 null 的问题。只需要注意 val 在某些情况下也是可变的就行了。...很好用,但也有坑 访问未初始化的 lateinit 属性会导致 UninitializedPropertyAccessException。...// 作为表达式 val max = if (a > b) a else b 6.哪里还有switch when 取代了类java 语言的 switch 操作符。...val属性-适用于private或internal,或者类型检查is/!is在声明属性的同一模块中执行; 不适用于open的属性,或者具有自定义getter的属性!...var局部变量—适用于变量在类型检查和使用之间没有修改,且不在修改它的lambda中捕获! var属性-不适用(因为该变量可随时被修改) 安全(可空)转换-操作符as?

    3.3K40
    领券