在throwable对象中重载getCause()方法

时间:2013-03-04 19:53:27

标签: java throwable

如何在throwable对象中重载getCause()方法? 我有以下但它似乎没有工作,因为它说它不能用字符串重载。

public class MyException extends RuntimeException   {
String cause;
MyException(String s)   {
    cause = s;
}
@Overwrite public String getCause()    {
    return cause;
}

2 个答案:

答案 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