Главная » Java » Предложения throws Java

0

В объявлении метода rерlасеValue, приведенном выше, ясно указано, какие объявленные исключения он способен генерировать. Язык требует предоставления подобной информации – программистам, которые обращаются к методу, необходимо знать о возможности возникновения исключений столько же, сколько и об особенностях поведения метода в нормальных условиях. Сведения об исключениях, которые могут быть выброшены методом, важны в такой же степени, как и данные о типе возвращаемых им значений – в объявлении метода должны быть отражены и те и другие.

Объявляемые методом исключения Указываются с помощью предложения throws в виде списка наименований типов исключений, разделяемых символом запятой. В списке должны присутствовать только те типы исключений, которые не обрабатываются в теле самого метода.

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

Часть контракта метода, определяемая предложением throws, строго проверяется – метод вправе выбрасывать исключения только тех типов, которые явно названы. Выбрасывание объявляемых Исключений других типов – как непосредственное, с помощью инструкции throw, так и косвенное, вследствие обращения к другим методам, – запрещается. Если в объявлении метода вообще Отсутствует предложение throws, это не значит, что не могут быть выброшены какие-либо исключения – речь идет только о невозможности генерирования объявляемых исключений.

Все стандартные исключения времени выполнения (такие как, например, ClassCastException и ArithmeticException) относятся к типам, производным от класса RuntimeException. Более серьезные ошибки фиксируются исключениями типов, производных от error, и такие исключения могут возникать в произвольный момент и в любом коде. RuntimeException, error и производные от них классы – это типы необъявляемых исключений; упоминать их в предложении throws не следует, поскольку они настолько вездесущи, что могут проявляться В любых ситуациях. Поэтому наличие этих типов в списке предложения throws компилятором не проверяется. Полный перечень стандартных типов необъявляемых исключений вы найдете в приложении А.

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

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

Вызывая метод, в определении которого содержится предложение throws с перечнем объявляемых исключений, вы получаете в свое распоряжение три возможные альтернативы дальнейших действий:

·      отловить исключения и обработать их;

·      отловить исключения и вместо них сгенерировать исключения таких типов, которые указаны в вашем собственном предложении throws;

·      объявить соответствующие исключения в собственном предложении throws и позволить им "пройти" через ваш код незамеченными (хотя при этом вы вправе использовать предложение finallу, которое прежде выполнит необходимые функции "очистки" состояния объекта; подробно об этом – ниже, в разделе 8.4.1 на странице 220).

Во всех случаях вы, разумеется, обязаны обрабатывать исключения, генерируемые и другими методами.

Составляя предложение throws, вы должны быть скрупулезны и аккуратны – целесообразно перечислить в нем все известные типы исключений, которые могут быть выброшены вашим кодом; это весьма желательно с точки зрения документирования программы. Насколько точным следует быть в той или иной ситуации – такой вопрос заслуживает отдельного изучения. Если вы разрабатываете общий интерфейс или базовый класс, необходимо подумать, какие полномочия вы хотели бы передать разработчикам будущих реализаций. Было бы вполне разумно определить общий класс исключений, указать его в предложении throws и разрешить создание на его основе частных классов для применения в конкретных реализациях класса или интерфейса. Подобная тактика применена при разработке пакета java.iо, в котором содержится объявление общего типа IOException, предназначенного для использования во всех методах ввода-вывода данных. Это позволяет методам конкретных реализующих классов выбрасывать исключения производных типов, отражающих особенности той или операции ввода-вывода.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии