You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行如下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:39:02