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

Kotlin派生类构造函数如何向基类传递含参数的字符串?

Kotlin异常层级中派生类消息丢失code参数的原因及解决方法

问题重现

你尝试构建异常层级,让特定异常携带额外的code参数并将其包含在异常消息中,但运行代码后发现code信息丢失,输出仅为原始message。

代码示例:

open class MyException(
    override val message: String,
): Exception(message)

data class MySpecialException(
    override val message: String,
    val code: Int,
): MyException("$message (with code $code)")

fun main() {
    val ex = MySpecialException("message", 123)
    println(ex.message)
}

运行输出:

message

原因分析

问题出在MySpecialException中override了message属性。作为data类的成员,这个message会直接使用构造时传入的原始值(即"message")。虽然你在调用父类构造时传入了拼接后的字符串"$message (with code $code)",父类Exception的message字段确实被设置成了带code的内容,但当你访问ex.message时,实际调用的是派生类自己override的message属性,而非父类的message字段,所以输出的是未拼接的原始值。

解决方案

方案1:移除派生类对message的override

既然父类已经定义了message属性,派生类无需重复override,直接将拼接后的消息传给父类即可:

open class MyException(
    override val message: String,
): Exception(message)

data class MySpecialException(
    val originalMessage: String,
    val code: Int,
): MyException("$originalMessage (with code $code)")

fun main() {
    val ex = MySpecialException("message", 123)
    println(ex.message) // 输出:message (with code 123)
}

这里把派生类的参数改成originalMessage,避免和父类的message冲突,父类的message会使用拼接后的值,访问ex.message时就会拿到带code的内容。

方案2:让派生类的message返回拼接后的值

如果需要保留message相关参数,可以自定义message的getter,让它返回拼接后的内容:

open class MyException(
    override val message: String,
): Exception(message)

data class MySpecialException(
    private val originalMessage: String,
    val code: Int,
): MyException("$originalMessage (with code $code)") {
    override val message: String
        get() = "$originalMessage (with code $code)"
}

fun main() {
    val ex = MySpecialException("message", 123)
    println(ex.message) // 输出:message (with code 123)
}

方案3:直接依赖父类的message字段

如果你不需要派生类的message作为data类成员,可以去掉override,直接依赖父类的message:

open class MyException(message: String): Exception(message)

data class MySpecialException(
    val code: Int,
    message: String,
): MyException("$message (with code $code)")

fun main() {
    val ex = MySpecialException(123, "message")
    println(ex.message) // 输出:message (with code 123)
}

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:45:48