如何在throwable对象中重载getCause()方法? 我有以下但它似乎没有工作,因为它说它不能用字符串重载。
public class MyException extends RuntimeException {
String cause;
MyException(String s) {
cause = s;
}
@Overwrite public String getCause() {
return cause;
}
答案 0 :(得分:2)
两种方法只有不同的返回类型是非法的。假设有人写道:
Object obj = myException.getCause();
这是完全合法的java,编译器无法确定它是String
版本还是Throwable
版本。
同样,您无法替换超类签名,因为这也是完全合法的:
Throwable t = new MyException();
Throwable t0 = t.getCause();
//Returns String?!?!?!?
答案 1 :(得分:0)
接受的答案可以清除问题:
只有两种返回方法不同的方法是非法的 输入
但是,如果原始情况为空,则getCause()
应该在MyException
中返回自定义原因。
在这种情况下,可以使用initCause()
来设置原因并覆盖toString()
方法。因此,当在getCause()
的对象上调用MyException
方法时,它将显示来自customCause的消息,而不是null。
用途是什么:在旧版系统中,如果您在记录日志时在getCause()
对象上使用了MyException
,现在您想为其添加自定义原因而无需更改很多代码,这就是方法。
public class MyException extends RuntimeException {
String customCause;
MyException(String s) {
super(s);
customCause = s;
}
@Override
public synchronized Throwable getCause() {
if (super.getCause() != null) {
return this;
} else {
this.initCause(new Throwable(customCause));
return this;
}
}
@Override
public String toString() {
String s = getClass().getName();
String message = getLocalizedMessage();
if (message == null) {
message = customCause;
}
return (message != null) ? (s + ": " + message) : s;
}
}
参考: https://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#initCause(java.lang.Throwable) https://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html