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

变量开始时为null,初始化后不能为null

牛景同
2023-03-14

在Kotlin中,如果变量在应用程序启动时为null,并且在创建后不能再次赋值为null,那么有什么方法可以对其进行注释吗?

我不能将field设置为例如var somefield:boolean?,因为它可以在某个时候被置为空,或者lateinit var somefield:boolean,因为它在使用之前被初始化(或者这可能是解决我的情况的正确方法?)。

共有1个答案

卢俭
2023-03-14

我不知道为什么lateinit对您不起作用,除了它对基本类型不起作用之外--但是Notnull委托可能就是您要找的:

class X {
    var z: String by Delegates.notNull()
}

val x1 = X()
x1.z = "foo"
println(x1.z) // foo

val x2 = X()
println(x2.z) // IllegalStateException: Property z should be initialized before get.

如果在设置它之前读取它,它将给您一个异常,否则该属性将具有非空类型。

 类似资料:
  • 我在后续代码中遇到了一个我之前不知道的行为。 考虑1st情况: 正如预期的那样,编译器在str为null-null指针访问时向我显示以下警告:变量str只能在此位置为null。 现在,当我移动该变量时,静态final字段初始化为null: 现在,编译器没有显示任何警告。好了,编译器应该知道,str是最终的,在代码的任何一点上都不会改变它的值。假设它是空的,那么以后肯定会导致空点异常。 尽管编译器在

  • 问题内容: 我有这个代码: 这会导致编译错误:可能尚未初始化,这很公平。 现在,我将代码更改为: 我得到同样的编译错误!我必须初始化为null: 那么,不初始化对象和初始化为null有什么区别?如果我声明一个没有初始化的对象,它是否为null? 谢谢 问题答案: 字段(成员变量)被初始化为(或初始化为默认的原始值,如果它们是原始的) 局部变量未初始化,您有责任设置初始值。

  • 问题内容: 我在用Java工作。 我通常会这样设置一些对象: 问题是:在此示例中是否等于,按原样我可以假定对未初始化的对象进行空检查将是准确的? 问题答案: 正确,未显式初始化的引用类型的静态成员和实例成员都由Java 设置为。相同的规则适用于数组成员。 根据Java语言规范的第4.12.5节: 变量的初始值 程序中的每个变量在使用值之前都必须具有一个值: 每个类变量,实例变量或数组组件在创建时均

  • 问题内容: 如何使用类型初始化变量? 因为我有错误 问题答案: 常量声明不能包含函数调用(某些例外,请参见下文),它们必须在编译时进行评估,而函数调用是在运行时进行的。 引用规格:常量: 常数值由符文,整数,浮点数,虚数或字符串文字表示,标识符表示常数,常数表达式,结果为常数的转换或某些内置结果的值函数,例如应用于任何值,或应用于某些表达式,以及应用于常量,以及应用于数字常量的复数。 并引用Spe

  • 问题内容: 我有一个方法创建一个,另一个方法更改字符串 我的编译器说它“可能尚未初始化”。 有人可以解释吗? 问题答案: 变量可能尚未初始化 在内部定义方法时,必须在其中初始化程序的每个变量中必须先使用一个值的地方。 同样重要的是,您的代码将永远无法正常运行,因为Java中的字符串是不可变的,因此您无法编辑字符串,因此应更改方法。 我将您的代码更改为类似的内容,但是我认为您的编辑方法应该做另一件事

  • 我已经检查过自己,我写了一个这样的程序 我运行了几次程序,结果始终是一样的,零。我在C中尝试过,结果是一样的。 但我的教科书说 如果未初始化函数内定义的变量,则该变量值将保持未定义状态。这意味着该元素具有以前驻留在内存中该位置的任何值。 当程序始终将可用内存位置分配给变量时,这怎么可能?它怎么可能是零以外的东西(我假设默认的可用内存值为零)?