多异常捕获中的未定义方法

时间:2017-06-01 17:00:36

标签: java exception catch-block multi-catch

我有两个继承自java.lang.Exception的类。它们都有一个具有相同签名void a(){...}的方法。它们都可以抛出代码块。如果我这样做:

catch (SubException1 | SubException2 e)
    {
        e.a();
    }

然后它将无法编译,因为方法a()不属于Exception。它是Java语言的缺陷吗?我应该如何正确设计我的代码以防止代码冗余?

2 个答案:

答案 0 :(得分:3)

当您在单个catch语句中捕获多个异常类型时,捕获的异常的推断类型是这些类的最大公分母。在您的情况下,最大的共同点是Exception,它没有方法void a()。为了使它可以被catch块访问,你可以将它提取到一个公共基类,或者(可以说)更优雅,在两个类实现的接口中定义它:

public interface SomeExceptionInterface {
    void a();
}

public class SomeException extends Exception implements SomeExceptionInterface {
    // Implementation...
}

public class SomeException2 extends Exception implements SomeExceptionInterface {
    // Implementation...
}

答案 1 :(得分:2)

如果需要访问名为a()的方法,则需要提供该方法的类型。一个简单的解决方案可能是:

public class AbstractSubException extends Exception {
    public abstract void a();
}

public class SubException1 extends AbstractSubException {
    @Override public void a() { ... }
}

public class SubException2 extends AbstractSubException {
    @Override public void a() { ... }
}

然后你可以抓住你的方式或(稍微简单一些):

catch (AbstractSubException e) {
    e.a();
}

方法a的代码可能在所有子类中都是相同的。然后你可以使它具体化并将代码放入父类。