Почему переопределенные методы не могут генерировать исключения шире, чем переопределенный метод? - PullRequest
90 голосов
/ 04 мая 2011

Я просматривал книгу SCJP 6 от Kathe sierra и натолкнулся на объяснения исключения исключений в переопределенном методе. Я совсем не понял. Кто-нибудь может мне это объяснить?

Метод переопределения НЕ должен выбрасывать проверенные исключения, которые являются новыми или шире, чем те, которые объявлены переопределенным методом. Например, метод, который объявляет FileNotFoundException, не может быть переопределен метод, который объявляет SQLException, Exception или любое другое время выполнения исключение, если это не подкласс FileNotFoundException.

Ответы [ 14 ]

1 голос
/ 04 мая 2011

Хорошо, java.lang. Исключение расширяет java.lang. Throwable.java.io.FileNotFoundException расширяет java.lang.Exception.Поэтому, если метод выбрасывает java.io.FileNotFoundException, тогда в методе переопределения вы не можете выбросить что-либо выше по иерархии, чем FileNotFoundException, например, вы не можете выбросить java.lang.Exception.Вы можете бросить подкласс FileNotFoundException, хотя.Однако вы будете вынуждены обработать исключение FileNotFoundException в переопределенном методе.Подберите немного кода и попробуйте!

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

0 голосов
/ 05 декабря 2018

Java - это , предоставляя вам выбор для ограничения исключений в родительском классе, поскольку предполагается, что клиент будет ограничивать то, что перехвачено . ИМХО, по сути, вы никогда не должны использовать эту «функцию», потому что вашим клиентам может понадобиться гибкость в будущем.

Java - старый язык, который плохо спроектирован. Современные языки не имеют таких ограничений. Самый простой способ обойти этот недостаток - сделать свой базовый класс throw Exception всегда. Клиенты могут выдавать более конкретные исключения, но сделать ваши базовые классы действительно широкими.

0 голосов
/ 17 октября 2018

Метод переопределения подкласса может выдавать только несколько проверенных исключений, которые являются подклассами проверенного исключения метода суперкласса, но не может генерировать несколько проверенных исключений, которые не связаны с проверенным исключением метода суперкласса

0 голосов
/ 07 января 2013

Какое объяснение мы приписываем ниже

class BaseClass {

    public  void print() {
        System.out.println("In Parent Class , Print Method");
    }

    public static void display() {
        System.out.println("In Parent Class, Display Method");
    }

}


class DerivedClass extends BaseClass {

    public  void print() throws Exception {
        System.out.println("In Derived Class, Print Method");
    }

    public static void display() {
        System.out.println("In Derived Class, Display Method");
    }
}

Класс DerivedClass.java генерирует исключение времени компиляции, когда метод print генерирует исключение, метод print () базового класса не генерирует никаких исключений

Я могу объяснить это тем, что Exception уже, чем RuntimeException, это может быть либо No Exception (ошибка времени выполнения), RuntimeException и их дочерние исключения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...