JLesson 25. Исключения в Java.

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

Что такое вообще исключительная ситуация при работе программы? Это ситуация, при которой код не может дальше выполняться (например, из-за отсутствия требуемых ему ресурсов) или выполняется с ошибками. Предположим, что вы пытаетесь получить данные из сети, подключение к которой отсутствует или читаете файл, которого просто не существует. Что делать в таких ситуациях? Эти два примера лишь немногие из проблем, которые могут возникнуть при запуске программы. Конечно, вы можете попытаться просто проигнорировать данные ситуации. Но подобных проблем и неожиданных прерываний работы программы у пользователя в реальности хотелось бы избежать. Ошибки нужно отлавливать и соответствующим образом обрабатывать. И. к сожалению, далеко не во всех языках есть необходимые для этого средства. Теперь перейдем к делу и посмотрим, как обработка исключительных ситуаций реализована на языке Java.

Иерархия.

Java – мощный язык объектно-ориентированного программирования. Поэтому все исключения в Java являются объектами-наследниками класса Throwable. Иерархия классов выстроена следующим образом:

4.1

Throwable – это суперкласс, представляющий собой исключительную ситуацию, от которого должны наследоваться все остальные типы исключений, в том числе и ваши собственные. Сам класс Throwable, как и все остальные классы Java, является также наследником класса Object. Исключительные ситуации в Java могут быть двух типов:

1). Error (ошибка) – отображает критические проблемы, возникающие при выполнение программы. Вы не будете обрабатывать ошибки в своем коде, так как они связаны с некорректной работой на уровне виртуальной машины Java. Примером ошибки, возникшей на уровне JVM, может быть закончившаяся память или переполнение стека.

2). Exception – это исключения, которые представляют собой обработку предсказуемых ситуаций в программе, которые можно и перехватить и обработать. Исключения делятся на проверяемые (checked) и непроверяемые (unchecked).

Проверяемые исключения – это исключения, относящиеся к классу Exception. Это те ситуации, которые могут и должны быть отработаны самим программистом.

Непроверяемые исключения — это исключения, которые могут возникнуть где угодно, например, так часто выбрасываемое, особенно у новичков, NullPointerException(использование пустой ссылки) или ArrayIndexOutOfBoundsException(выход за границы массива). Непроверяемые исключения – это классы Error и RuntimeException, а также их подклассы. Программист не обязан их обрабатывать самостоятельно в своем коде.

Зачастую разработчики обходятся только использованием непроверяемых исключений в своем коде. И в чем-то это даже правильно. Однако использование проверяемых исключений предоставляет вам довольно мощный инструмент для тестирования своего приложения и устранения возможных неполадок.

Исключительный код.

Как же в коде перехватывать и обрабатывать исключительные ситуации? Для этого в Java предусмотрен набор ключевых слов: try, catch, finally, throw и throws. На первый взгляд кажется, что их даже много, но логически все совсем не сложно.

Код, который вы хотите проверить на возникновение исключительной ситуации, следует поместить внутрь блока try-catch. Допустим, мы хотим записать что-то в файл и хотим обработать возможные исключительные ситуации, например, когда файла не существует, следует сообщить об ошибке.

После ключевого слова catch в круглых скобках следует указать исключения какого типа вы хотите обрабатывать. Если ситуация. относящаяся к исключению данного типа произойдет при выполнении кода в блоке try-catch, то будет выброшено исключение данного типа и управление перейдет в блок catch.

Например, это могут быть исключения, связанные с ошибкой ввода/вывода. Тогда код будет выглядеть следующим образом:

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

Мы могли воспользоваться конструктором со строковым параметром, значение которого может сообщать какую-нибудь дополнительную информации о данном исключении и в случае необходимости может быть получено вызовом метода getMessage(), определенного в классе Throwable.

Здесь мы пользуемся ключевым словом super для вызова конструктора суперкласса с параметром типа String.

Ключевое слово throw применяется для генерации исключений. Например:

if(условие) throw new ТипИсключения();

Полезные методы.

Класс Throwable определяет ряд интересных методов.

String getMessage() — возвращает детализированную информацию о возбуждаемом исключении.

String getLocalizedMessage() — возвращает дополнительную информацию о возбуждаемом исключении, специфичную для данного контекста.

void printStackTrace() — выполняет вывод самого исключения и последовательность вызовов, которые привели к этому исключению.

StackTraceElement[] getStackTrace() — возвращает ту же самую последовательность вызовов, что и в printStackTrace(), но в виде отдельных кадров стека.

Блок finally.

Еще один полезный инструмент в случае обработки исключительной ситуации. Если в блоке try выполняется подключение к сетевому соединению или используются какие-то другие ресурсы, то надо быть уверенным в том, что эти ресурсы впоследствии будут освобождены. Или, допустим, что некоторые действия должны быть обязательно выполнены вне зависимости от того, было выброшено исключение или нет. Операции, заключенные в блок finally будут выполнены в любом случае. Поэтому если вы хотите произвести какие-то завершающие или же другие действия и не задумываться о том, что что-то было пропущено, то это то, что нужно. Блок finally следует разместить после всех обработчиков catch:

Делегирование исключений.

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

Ключевое слово throws – используется для делегирования исключений вышестоящим методам. В этом случае исключение не будет обработано в том методе, в котором оно было выброшено. Для делегирования исключений вышестоящему методу необходимо после определения сигнатуры метода указать тип исключения, который не следует обрабатывать в данном коде.

Таким же образом можно указать сразу несколько исключений:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *