2013-10-03 3 views
6

Так вот цитата из книги:Перекрытие Метод с Exception

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

Теперь вот мой вопрос, если метод в суперклассе вызывает исключение, то может ли метод overriding НЕ выбрасывать исключение вообще?

Потому что я просто попробовал это на Java, где метод переопределения не выбрал никаких исключений и не было ошибок.

Просьба пояснить.

ответ

9

Вы можете объявить метод переопределения как бросание меньшего количества исключений, чем суперкласс, вы просто не можете вводить новые. Метод подкласса должен быть совместим с поведением метода суперкласса. Точнее, вы должны иметь возможность подставлять объекты подкласса для объектов суперкласса, не нарушая ничего (добавление нового проверенного исключения в предложение throws означает, что вещи, вызывающие его, должны будут изменить свой код для его обработки).

(Идея заключается в том, что программа Liskov Substitution Principle: программа должна иметь возможность иметь дело с объектами на высоком уровне, не зацикливаясь на деталях о точном типе. Если подклассы могут вводить изменения, которые означают, что программа должна их выбирать и обрабатывать их по-разному, то он побеждает цель абстракции.)

Таким образом, переопределяющий метод может быть объявлен как исключение исключенных исключений вообще (путем опускания предложения бросков целиком), поскольку это не требует каких-либо изменений звонящие.

В JDK есть примеры, например, в java.io, где подкласс не может выдавать исключение, объявленное суперклассом (см. Метод закрытия ByteArrayOutputStream). Здесь метод close мог бы удалить предложение throws, поскольку он никогда не выбрасывает IOException. (Может быть, это было на случай, если кто-то захочет подклассифицировать его версией, которая выбрасывает IOException?)

+0

И может * объявить *, что он не выбрал исключенных исключений, опуская предложение 'throws'. –

+0

@Software Monkey: да, исправляя формулировку, чтобы сделать это яснее. –

+0

Спасибо за подробное объяснение –

Смежные вопросы