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
相关产品推荐
相关产品推荐

