Главная » Java » Правила использования исключений Java

0

в начале главы, говоря об обстоятельствах возникновения исключений, мы употребили фразу "неожиданная ошибочная ситуация". Исключения, вообще говоря, не предназначены для описания простых, предсказуемых условий работы программы. Например, достижение конца входного потока данных в процессе его чтения – это совершенно очевидная ситуация, поэтому умение обрабатывать условие "конец потока" должно быть неотъемлемой частью контракта метода, который возвращает из Потока очередной элемент данных. В этом смысле вполне разумно в качестве признака достижения конца потока использовать специальный флаг – такое соглашение легко для понимания и реализации разработчиками сторонних приложений. Рассмотрим программный фрагмент, представляющий типичную ситуацию, в которой целесообразно использовать возвращаемый флаг:

while ((token = stream.next()) != Stream.END) process(token);

stream. close();

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

try {

for (;;) {

process(stream.next());

               }                                                    .

} catch (streamEndExceptlon е) {

stream.close() ;

}

В первом примере поток вычислений выглядит простым и прямолинейным. Цикл выполняется до момента достижения конца потока, после чего Поток закрывается. Во втором случае используется выражение бесконечного цикла. Если не знать о том, что факт достижения конца потока фиксируется исключением типа StreamEndException, о продолжительности циклического процесса не удастся сказать ничего определенного. Даже если вы и осведомлены о назначении исключения StreamEndException, конструкция все равно выглядит запутанной, поскольку средства прерывания цикла вынесены во внешний блок try.

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

while (!stream.eof())

process(stream.nextDouble());

stream.close();

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

Конечно, четких критериев определения того, какую ситуацию считать неожиданной, а какую – предсказуемой, просто не существует. Главное состоит в том, Чтобы не поддаться искушению применять механизм обработки исключений Там, где без него вполне можно обойтись.

Упражнение 8.2. Подумайте, каким образом программа должна сообщать о возникновении следующих ситуаций:

·      Предпринята попытка присваивания отрицательного значения полю объекта класса passengervehiсlе, описывающему параметр вместимости легкового автомобиля;

·      обнаружена ошибка в файле конфигурации, который используется для Инициализации переменных программы;

·      метод, предусматривающий поиск заданного слова-образца в массиве объектов stri ng, не может обнаружить искомого слова;

·      файл, на который ссылается метод "открытия", не существует;

·      файл существует и успешно открывается, но не может быть использован из-за отсутствия достаточных прав;

·      при открытии сетевого соединения с удаленным процессом сервера последний сообщает о возникших проблемах;

·      в ходе работы с удаленным процессом сервера сетевое соединение разрывается.

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

По теме:

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