Неопределенный метод в множественном исключении

У меня есть два класса, наследующие от 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 одинаков во всех подклассах. Затем вы можете сделать его конкретным и поместить код в родительский класс.

Другие вопросы по тегам