我正在尝试找到Exception在Scala中扩展Java的最简单但最合适的方法.例如,下面是不正确的,因为new Exception(null, cause)和new Exception(cause)有根据不同的行为Throwable.java:
class InvalidVersionException(message: String = null, cause: Throwable = null)
extends IllegalArgumentException(message, cause) {
def this(message: String) = this(message, null)
// This is not same with super(cause)
def this(cause: Throwable) = this(null, cause)
}
Run Code Online (Sandbox Code Playgroud)
因为我知道Throwable(cause)设置消息cause.toString(),我想出了以下内容:
class InvalidVersionException(message: String = null, cause: Throwable = null)
extends IllegalArgumentException(if ((message eq null) && (cause ne null)) cause.toString else message, cause) {
def this(message: String) = this(message, null)
def this(cause: Throwable) = this(null, cause)
}
Run Code Online (Sandbox Code Playgroud)
但是,这仍然有:
if ((message eq null) && (cause ne null)) cause.toString
Run Code Online (Sandbox Code Playgroud)
这是重复的Throwable.java.
有没有更好的方法来扩展Exception没有任何代码重复?
根据@Shadowlands的回答,我最终得到以下结果:
class InvalidVersionException(message: String, cause: Throwable = null)
extends IllegalArgumentException(message, cause) {
def this(cause: Throwable) = this(if (cause ne null) cause.toString else null, cause)
def this() = this(null)
}
Run Code Online (Sandbox Code Playgroud)
..节省了 54 个字节。