为什么这些方法无法编译

时间:2019-10-21 23:00:02

标签: java java-8

我有一个多捕获异常块,它的方法不能编译,两个类之间没有继承关系 我仍然无法定义此错误背后的规则,这是我的代码:

class MyException extends RuntimeException {
    public void log() {
        System.out.println("Logging MyException");
    }
}

class MyException2 extends RuntimeException {
    public void log() {
        System.out.println("Logging MyException2");
    }
}

public class Test {
    public static void main(String[] args) {
        try {
            throw new MyException();
        } catch(MyException | MyException2 ex){
            ex.log(); // this doesn't compile !
        }
    }
}

2 个答案:

答案 0 :(得分:1)

仅仅因为这两个类具有相同名称的方法并不意味着您可以调用该方法并发生正确的事情。

要使其工作,必须 要么分别捕获这两种异常类型,要么让它们实现包含log()方法的公共接口。

答案 1 :(得分:0)

您可能想要实现包含log()方法的自定义通用接口:

public interface LoggingException {
    void log();
}

并从中实施您的异常:

public class MyException extends RuntimeException implements LoggingException {
    public void log() {
        System.out.println("Logging MyException");
    }
}

注意:将自定义功能添加到异常(尤其是日志记录)不是常见的做法。您可能想在外部使用记录器并执行以下操作:

catch(Exception e) {
    log.error("error happened", e);
}