多重异常捕获中的未定义方法
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...
}
我有两个 类 继承自 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...
}