Неопределенный метод в множественном исключении
У меня есть два класса, наследующие от java.lang.Exception
, У них обоих есть метод с одинаковой подписью void a(){...}
, Они оба могут быть брошены в блок кода. Если я сделаю:
catch (SubException1 | SubException2 e)
{
e.a();
}
Тогда это не скомпилируется, потому что метод a()
не относится к исключению. Это недостаток языка Java? Как правильно разработать свой код, чтобы избежать избыточности кода?
2 ответа
Когда вы перехватываете несколько типов исключений в одном операторе 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...
}
Если вам нужен доступ к методу 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
одинаков во всех подклассах. Затем вы можете сделать его конкретным и поместить код в родительский класс.