我有两个继承自java.lang.Exception
的类。它们都有一个具有相同签名void a(){...}
的方法。它们都可以抛出代码块。如果我这样做:
catch (SubException1 | SubException2 e)
{
e.a();
}
然后它将无法编译,因为方法a()
不属于Exception。它是Java语言的缺陷吗?我应该如何正确设计我的代码以防止代码冗余?
答案 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
的代码可能在所有子类中都是相同的。然后你可以使它具体化并将代码放入父类。