Java 如何在Scala中将异常子类化

Java 如何在Scala中将异常子类化,java,scala,Java,Scala,可能重复: 我想编写一个Scala exception类,该类对Java exception类进行子类化,并提供类似的构造函数(每个构造函数都调用相应的exception构造函数。例如,我将如何编写这个Java类的Scala等价物: public class MyException extends java.lang.Exception { public MyException () { } public MyException (String msg) {

可能重复:

我想编写一个Scala exception类,该类对Java exception类进行子类化,并提供类似的构造函数(每个构造函数都调用相应的exception构造函数。例如,我将如何编写这个Java类的Scala等价物:

public class MyException extends java.lang.Exception {
    public MyException () {
    }

    public MyException (String msg) {
        super(msg);
    }

    public MyException (Throwable e) {
        super(e);
    }

    public MyException (String msg, Throwable cause) {
        super(msg, cause);
    }
}

这似乎与以下问题有关,但其中的答案并不令人满意(因为实际上没有定义子类).

这种重载构造函数的情况是我所知道的Scala无法生成与Java等效的字节码的唯一情况。在Scala中,必须调用主构造函数。可以定义辅助构造函数,但它们只能调用主构造函数


我认为Scala方法要好得多,但它确实意味着无法定义与异常类精确等价的类。这在实践中从未给我带来问题,因为您可以将null或其他默认值传递给最通用的超类构造函数。

使用默认值(null)如何


这个问题的公认答案并没有回答我的问题,因为它没有调用不同的构造函数。相反,它利用异常的实现细节进行欺骗,并为每个子类构造函数调用相同的基类构造函数。在Scala中,不可能有多个构造函数。因此,lin的公认答案ked问题确实回答了你的问题。正如@Antoras所说:@Antoras Scala确实有多个构造函数-@jon hanson,但如果你仔细阅读:[…]在Java中,如果一个构造函数调用另一个构造函数,那么该调用必须是构造函数中的第一个语句。Scala与之相同,只是在Scala中必须调用主构造函数。[…]因此,您应该始终从另一个构造函数调用主构造函数,而不能调用
super(…)
。Scala也不能生成与Java枚举对应的字节码。是的,我确实忘记了这一点。
class YourException (msg:String=null, cause:Throwable=null)
  extends java.lang.Exception (msg, cause) {}