运行如下Kotlin代码为何未抛出"no empty, please"运行时异常?
问题原因
你写的自定义setter逻辑仅在主动给color属性赋值时才会触发,类初始化阶段给color赋初始值的操作不会走setter逻辑,所以传入空字符串初始化Car实例时不会抛出异常。
Kotlin中类属性的初始化赋值是直接操作幕后字段field完成,完全绕开你定义的set逻辑,你当前的代码仅能拦截实例创建完成后对color属性的修改操作,无法校验初始化传入的参数。
修复方案
如果需要初始化阶段也触发空值校验,可以选以下任意一种方案实现:
方案1:在init初始化块中新增参数校验
class Car(val name: String, col: String) { val fuel = 100 var color = col set(value) { if (value.isBlank()) { throw RuntimeException("no empty, please") } field = value } init { if (col.isBlank()) { throw RuntimeException("no empty, please") } } }
方案2:初始化时主动调用setter触发校验
不在属性定义时直接赋值,改成在init块中通过this.color赋值,主动触发setter逻辑:
class Car(val name: String, col: String) { val fuel = 100 var color: String set(value) { if (value.isBlank()) { throw RuntimeException("no empty, please") } field = value } init { this.color = col } }
内容的提问来源于stack exchange,提问作者Abhinandan Thakur
相关产品推荐
相关产品推荐

