exception - Kotlin 构造函数属性和调用不同的父类(super class)构造函数

标签 exception kotlin

我想使用 kotlin 数据类作为异常(exception),这似乎很好:

data class MyException(val extraData: Any) : RuntimeException()

我也希望能够传入 cause在那些存在的情况下,到父类(super class)。不幸的是,数据类只能有 val/var在它们的主构造函数中,并且由于默认构造函数调用无参数 RuntimeException()构造函数,似乎我根本无法做到这一点而不总是需要 cause被传递,并作为字段存储在我的类(class)中,这是我不想要的。

我想要的是这样的:
data class MyException(val extraData: Any) : RuntimeException() {
    constructor(extraData: Any, cause: Throwable) : this(extraData) super(cause) {}
}

看来就算不使用数据类,还是用不上方便的var/val构造函数助手,因为它们只能在必须选择使用哪个 super 构造函数的主构造函数上。我能想到的最好的就是这个,它非常冗长:
class MyException : RuntimeException {
    val extraData: Any

    constructor(extraData: Any) {
        this.extraData = extraData
    }

    constructor(extraData: Any, cause: Throwable) : super(cause) {
        this.extraData = extraData
    }
}

我错过了什么吗?真的没有办法基于重载的构造函数有条件地调用不同的父类(super class)构造函数并且仍然能够使用 var/val参数语法?如果是这样,为什么?有没有更好的方法来做这种事情?

最佳答案

由于两者 this(...) & super(...)是构造函数中的第一条语句,因此您不能同时调用它。否则,您将获得编译时错误。

中频 任何类都包含 primary constructor , 他们的 secondary constructors必须显式调用它的主构造函数,所以你不能调用额外的 super(...)完全在二级构造函数上。

if the class has a primary constructor, each secondary constructor needs to delegate to the primary constructor, either directly or indirectly through another secondary constructor(s). Delegation to another constructor of the same class is done using the this keyword



但是还有另一种方法可以通过 Throwable#initCause 设置原因, 例如:
data class MyException(val extraData: Any) : RuntimeException() {
    constructor(extraData: Any, cause: Throwable) : this(extraData) {
        initCause(cause)
    }
}

data class专为 POJO 设计而不是 Exception s。

关于exception - Kotlin 构造函数属性和调用不同的父类(super class)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45110194/

相关文章:

c++ - 协助 C++ 程序分析

sql-server - MS SQL Server 强制转换无一异常(exception)

kotlin - 如何将 Kotlin 的 MutableList 初始化为空 MutableList?

android - Kotlin-如何从日历中获取日期为 "dd"和月份为 "mm"?

c# - 尝试检索实体时,L2S 调用导致有关 int 的空分配的异常

php - 为什么我的异常没有被 catch 捕获?

java - 尽管处理了异常错误

java - 如何在 Java 中将 Java 集合转换为 Kotlin 序列(反之亦然)?

java - 是否有一种标准方法可以将 Kotlin 序列转换为 java.util.Enumeration?

kotlin - 如何从 Kotlin 的 ListView 中获取所选项目?