Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Основной принцип заключается в том, что имя исключения относительно полно объясняет суть возникшей проблемы. Не все исключения определены в пакете java.lang, некоторые из них созданы для поддержки других библиотек, таких как util, net и io, как можно видеть из полных имен их классов или из базовых классов. Например, все исключения, связанные с вводом/выводом (I/O), унаследованы от java.io.IOException.

Особый случай: RuntimeException

Вспомним первый пример в этой главе:

if(t == null)

throw new NullPointerExceptionO;

Только представьте, как ужасно было бы проверять

таким образом каждую ссылку, переданную вашему методу. К счастью, делать это не нужно — такая проверка автоматически выполняется во время исполнения Java-программы, и при попытке использования null-ссылок автоматически возбуждается Null-PointerException. Таким образом, использованная в примере конструкция избыточна.

Есть целая группа исключений, принадлежащих к этой категории. Они всегда возбуждаются в Java автоматически, и вам не придется включать их в спецификацию исключений. Все они унаследованы от одного базового класса RuntimeException, что дает нам идеальный пример наследования: семейство классов, имеющих общие характеристики и поведение. Вам также не придется создавать спецификацию исключений, указывающую на возбуждение методом RuntimeException (или любого унаследованного от него исключения), так как эти исключения относятся к неконтролируемым (unchecked). Такие исключения означают ошибки в программе, и фактически вам никогда не придется перехватывать их — это делается автоматически. Проверка RuntimeException привела бы к излишнему загромождению программы. И хотя вам обычно не требуется перехватывать RuntimeException, возможно, вы посчитаете нужным возбуждать некоторые из них в своих собственных библиотеках программ.

Что же происходит, когда подобные исключения не перехватываются? Так как компилятор не заставляет перечислять такие исключения в спецификациях, можно предположить, что исключение RuntimeException проникнет прямо в метод mainQ, и не будет перехвачено. Чтобы увидеть все в действии, испытайте следующий цример:

//: exceptions/NeverCaught java

// Игнорирование RuntimeExceptions.

// {ThrowsException}

public class NeverCaught {

static void f {

throw new RuntimeException("H3 f(D;

}

static void g { f;

}

public static void mainCString[] args) {

g:

}

} ///.-

Можно сразу заметить, что RuntimeException (и все от него унаследованное) является специальным случаем, так как компилятор не требует для него спецификации исключения. Выходные данные выводятся в System.err:

Exception in thread "main" java.lang.RuntimeException- Из f at NeverCaught.f(NeverCaught.java:7) at NeverCaught.g(NeverCaught.java:10) at NeverCaught.main(NeverCaught.java-13)

Мы приходим к ответу на поставленный вопрос: если RuntimeException добирается до main без перехвата, то работа программы завершается с вызовом метода printStackTraceO.

Помните, что только исключения типа RuntimeException (и производных классов) могут игнорироваться во время написания текста программы, в то время как остальные действия компилятор осуществляет в обязательном порядке. Это объясняется тем, что RuntimeException является следствием

ошибки программиста, например:

• ошибки, которую невозможно предвидеть (к примеру, получение null-ссылки в вашем методе, переданной снаружи);

• ошибки, которую вы как программист должны были проверить в вашей программе (подобной ArraylndexOutOfBoundsException, с проверкой размера массива). Ошибки первого вида часто становятся причиной ошибок второго вида.

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

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

Завершение с помощью finally

Часто встречается ситуация, когда некоторая часть программы должна выполняться независимо от того, было или нет возбуждено исключение внутри блока try. Обычно это имеет отношение к операциям, не связанным с освобождением памяти (так как это входит в обязанности сборщика мусора). Для достижения желаемой цели необходимо разместить блок finally17 после всех обработчиков исключений. Таким образом, полная конструкция обработки исключения выглядит так:

try {

// Защищенная секция: рискованные операции, // которые могут породить исключения А, В. или С } catch(A al) {

// Обработчик для ситуации А } catch(B Ы) {

// Обработчик для ситуации В } catch(C cl) {

// Обработчик для ситуации С } finally {

// Действия, производимые в любом случае

}

Чтобы продемонстрировать, что блок finally выполняется всегда, рассмотрим следующую программу:

//: exceptions/FinallyWorks.java // Блок finally выполняется всегда

class ThreeException extends Exception {}

public class FinallyWorks { static int count = 0; public static void main(String[] args) { while(true) { try {

// Операция постфиксного приращения, в первый раз 0: if(count++ == 0)

throw new ThreeExceptionO; System.out.println("Нет исключения"); } catch(ThreeException e) {

System.out.pri ntln("ThreeExcepti on"); } finally {

System.out.println("B блоке finally"); if(count == 2) break; // вне цикла "while"

}

}

}

} /* Output: ThreeException В блоке finally Нет исключения В блоке finally *///-

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

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

Поделиться:
Популярные книги

Том 8. Проза, незавершенное 1841-1856

Некрасов Николай Алексеевич
8. Собрание сочинений в пятнадцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 8. Проза, незавершенное 1841-1856

Компьютерные сети. 6-е изд.

Д. Таненбаум Э. С., Фимстер Н. , Уэзеролл
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Компьютерные сети. 6-е изд.

Полное собрание сочинений в одной книге

Зощенко Михаил Михайлович
Проза:
классическая проза
русская классическая проза
советская классическая проза
6.25
рейтинг книги
Полное собрание сочинений в одной книге

Танцующая с Ауте. Трилогия

Парфенова Анастасия Геннадьевна
14. В одном томе
Фантастика:
фэнтези
8.78
рейтинг книги
Танцующая с Ауте. Трилогия

Церковь в мире людей

Кураев Андрей Вячеславович
Религия и эзотерика:
религия
6.00
рейтинг книги
Церковь в мире людей

Легенды II (антология)

Хобб Робин
Золотая серия фэнтези
Фантастика:
фэнтези
научная фантастика
4.83
рейтинг книги
Легенды II (антология)

Избранные произведения. I том [Компиляция]

Хаггард Генри Райдер
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Избранные произведения. I том [Компиляция]

АН (цикл 11 книг)

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
АН (цикл 11 книг)

Муравейник Хеллстрома

Герберт Фрэнк Патрик
Фантастика:
научная фантастика
5.75
рейтинг книги
Муравейник Хеллстрома

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Гильдия. Компиляция 1-10

Бергер Евгений
Гильдия
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Гильдия. Компиляция 1-10

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Армагеддон. Омнибус

Грин Джонатан
Армагеддон
Фантастика:
эпическая фантастика
5.00
рейтинг книги
Армагеддон. Омнибус

Путеводная звезда. Том 2

Извольский Сергей
7. Варлорд
Фантастика:
боевая фантастика
5.50
рейтинг книги
Путеводная звезда. Том 2