Метод Over езда и наследование и исключения

Может ли метод в подклассе переопределить метод в родительском классе и вызвать исключение времени выполнения, когда метод в родительском классе не выдает исключение? Что-то вроде этого:

class X { public void foo() { System.out.print("X "); } }

public class SubB extends X {
    public void foo() throws RuntimeException {
        super.foo();
        if (true) 
            throw new RuntimeException();
        System.out.print("B ");
    }

    public static void main(String[] args) {
        new SubB().foo();
    }
}

1 ответ

Решение

Да, потому что исключения времени выполнения не являются частью сигнатуры метода. (Вы можете добавить их, но компилятору все равно, они просто документация.)

Я думаю, что обоснование состоит в том, что RuntimeExceptions, как правило, являются ошибками программиста, такими как NPE или выход за пределы массива, поэтому нет смысла пытаться ограничивать их так, как проверяются исключения. Вы не можете создать правило, говорящее, что этот метод (и любой метод, переопределяющий его) никогда не может генерировать исключение NullPointerException, потому что JVM не дает такого рода гарантий.

В спецификации языка Java в разделе "Проверка исключений во время компиляции" говорится:

Классы непроверенных исключений (§11.1.1) освобождаются от проверки во время компиляции.

Из классов непроверенных исключений классы ошибок исключаются, поскольку они могут возникать во многих точках программы, и восстановление из них затруднено или невозможно. Программа, объявляющая такие исключения, будет бесполезна, бесполезна. Сложные программы могут все же захотеть поймать и попытаться оправиться от некоторых из этих условий.

Из классов непроверенных исключений классы исключений во время выполнения освобождены, потому что, по мнению разработчиков языка программирования Java, необходимость объявления таких исключений не поможет в значительной степени установить правильность программ. Многие операции и конструкции языка программирования Java могут приводить к исключениям во время выполнения. Информация, доступная для компилятора Java, и уровень анализа, выполняемого компилятором, обычно недостаточны, чтобы установить, что такие исключения во время выполнения не могут возникнуть, даже если это может быть очевидно для программиста. Требование, чтобы такие классы исключений были объявлены, было бы просто раздражением для программистов.

Например, определенный код может реализовывать круговую структуру данных, которая по построению никогда не может включать нулевые ссылки; тогда программист может быть уверен, что исключение NullPointerException не может произойти, но компилятору Java будет трудно доказать это. Технология доказательства теорем, которая необходима для установления таких глобальных свойств структур данных, выходит за рамки данной спецификации.

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