繁体   English   中英

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

[英]Overloading the getCause() method in a throwable object

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

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

拥有两种只返回类型不同的方法是违法的。 假设有人写道:

Object obj = myException.getCause();

这是完全合法的java,编译器无法弄清楚它是String版本还是Throwable版本。

同样,您无法替换超类签名,因为这也是完全合法的:

Throwable t = new MyException();
Throwable t0 = t.getCause();
//Returns String?!?!?!?

接受的答案清除了这一点

拥有两种只返回类型不同的方法是违法的

但是如果你遇到这种情况, getCause()应该在MyException返回自定义原因,以防原始原因为null。

在这种情况下,您可以使用initCause()来设置原因并覆盖toString()方法。 因此,当在MyException对象上调用getCause()方法时,它将显示来自customCause而不是null的消息。

有什么用:在遗留系统中,如果你在登录时在MyException对象上使用了getCause() ,现在你想在不改变代码的情况下添加自定义原因,这就是方法。

    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/文档/ API / JAVA / LANG / Throwable.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM