当前位置: 首页 > 知识库问答 >
问题:

如何检查"lateinit"变量是否已初始化?

盛辰沛
2023-03-14

我想知道是否有办法检查lateinit变量是否已初始化。例如:

class Foo() {

    private lateinit var myFile: File

    fun bar(path: String?) {
        path?.let { myFile = File(it) }
    }

    fun bar2() {
        myFile.whateverMethod()
        // May crash since I don't know whether myFile has been initialized
    }
}

共有3个答案

仲孙绍元
2023-03-14

您可以通过以下方式轻松做到这一点:

::variableName.isInitialized

this::variableName.isInitialized

但是如果你在一个听众或内部类中,请这样做:

this@OuterClassName::variableName.isInitialized

注意:如果您在声明变量的同一个文件(同一个类或内部类)中编写上述语句,则它们可以正常工作,但如果您想检查其他类(可能是超类或任何其他实例化的类)的变量,则这将不起作用,例如:

class Test {
    lateinit var str:String
}

并检查str是否初始化:

我们在这里做的是:在Test2类中检查Test类的字段str。我们得到了一个错误,var的支持字段此时不可访问。检查一个已经提出的问题。

公羊凌
2023-03-14

使用。isInitialized属性可以检查lateinit变量的初始化状态。

if (::file.isInitialized) {
    // File is initialized
} else {
    // File is not initialized
}
封梓
2023-03-14

Kotlin 1.2中有一个lateinit改进,允许直接检查lateinit变量的初始化状态:

lateinit var file: File    

if (this::file.isInitialized) { ... }

查看JetBrains博客上的公告或KEEP提案。

更新:Kotlin 1.2已经发布。您可以在这里找到lateinit增强功能:

  • 检查lateinit变量是否已初始化
  • Lateinit顶级属性和局部变量
 类似资料:
  • 我想知道是否有一种方法可以检查变量是否已经初始化。例如:

  • 问题内容: 我需要使用类似于php的isset函数的东西。我知道php和java截然不同,但是php是我先前类似编程知识的唯一基础。是否有某种方法可以返回一个布尔值,用于确定实例变量是否已初始化。例如… 到目前为止,我遇到了这个问题,当我的程序试图隐藏或删除尚未构造的对象时,出现运行时错误。 问题答案: 假设您对是否已为变量 明确赋值 感兴趣,答案是“不是真的”。但绝对的字段(实例变量或类变量)尚

  • 因为我是android开发新手,所以我不知道如何在使用lateinit变量之前初始化它。在此之前,我尝试过执行,就像这个github中提到的,但没有成功。所以现在我希望问题出在初始化textInput变量上。

  • 问题内容: 哪种方法检查变量是否已初始化是更好/正确的方法?(假设变量可以容纳任何内容(字符串,整数,对象,函数等)) 要么 要么 问题答案: 该运营商将检查变量真的不确定。 该运营商,不同于其他运营商,不会抛出 的ReferenceError 与未声明的变量使用时例外。 但是,请注意将返回。我们必须小心避免将变量初始化为的错误。为了安全起见,我们可以改用以下方法:

  • 我正在将一个项目从java迁移到kotlin,该项目使用了许多可能为空的变量,并且在与用户或外部作业进行一些交互之前不会初始化它们。 我试图使用kotlin null安全优势,并且我试图避免在源代码中使用<code>nulllateinitvar location:location?=空 我这样做是为了避免使用< code >?每次我需要使用这些变量时。现在的问题是...如果变量没有初始化会发生什

  • 我找到了静态编程语言Lazy对象的答案,在这里使用:静态编程语言:检查Lazy val是否已初始化 但看起来像匕首。Lazy没有相同的公共方法。 这就是我如何懒洋洋地使用Dagger注射: 如何在不调用someService的情况下检查someService是否已初始化。get()哪个将初始化它?除了引入布尔标志并自己跟踪它之外。。 谢谢