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

Undefined method in multiple-exception-catch

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

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

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

如果您需要访问一个名为 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 的代码在所有子 class 中都是相同的。然后你可以具体化,把代码放到parent class.

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

public interface SomeExceptionInterface {
    void a();
}

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

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