
136
|
第
8
章
8.3
确保值不为空
问题
如何在首次访问一个变量时,如果它未初始化就抛出一个异常?
解决方案
使用 notNull 函数提供一个委托,如果该变量没有初始化则该委托抛出一个异常。
讨论
通常,在构造过程中会初始化 Kotlin 类中的属性。延迟初始化的一种方法是使用
notNull 函数,该函数提供一个委托,如果在首次访问该属性之前使用该属性,则该
委托将抛出异常。
示例 8-7 声明了一个名为 shouldNotBeNull 的属性,该属性必须在被使用之前在某
处初始化。
示例 8-7:需要在访问之前初始化,但不指定如何初始化
var shouldNotBeNull: String by Delegates.notNull<String>()
示例 8-8 中的测试用例表明,如果在尝试给属性赋值之前访问该属性,则 Kotlin 将抛出
IllegalStateException。
示例 8-8:查看 notNull 委托的行为
@Test
fun `uninitialized value throws exception`() {
assertThrows<IllegalStateException> { shouldNotBeNull }
}
@Test
fun `initialize value then retrieve it`() {
shouldNotBeNull = "Hello, World!"
assertDoesNotThrow { shouldNotBeNull }
assertEquals("Hello, ...