АБОБА. Справочник по программированию на Java Методическое пособие
Скачать 242.41 Kb.
|
Обработка ошибок в JavaИсключение Java представляет собой объект, который описывает исключительную (то есть, ошибочную) ситуацию, возникающую в части программного кода. Когда такая исключительная ситуация возникает, создается объект, представляющий исключение, который возбуждается в методе, вызвавшем ошибку. Этот метод может либо обработать исключение самостоятельно, либо пропустить его. В обоих случаях, в некоторой точке исключение перехватывается и обрабатывается. Исключения могут генерироваться системой времени выполнения Java, либо они могут быть сгенерированы вручную вашим кодом. Исключения, которые возбуждает Java, имеют отношение к фундаментальным ошибкам, которые нарушают правила языка Java либо ограничения системы выполнения Java. Вручную сгенерированные исключения обычно применяются для того, чтобы сообщить о некоторых ошибочных ситуациях тому, кто вызвал данный метод. Обработка исключений Java управляется пятью ключевыми словами: try, catch, throw, throws и finally. Если кратко, они работают следующим образом. Операторы программы, которые вы хотите отслеживать на предмет исключений, помещаются в блок try. Если исключение возникает в блоке try, оно возбуждается. Ваш код может перехватить исключение (используя catch) и обработать его некоторым осмысленным способом. Сгенерированные системой исключения автоматически возбуждаются системой времени выполнения Java. Чтобы вручную возбудить исключение, используется ключевое слово throw. Любое исключение, которое возбуждается внутри метода, должно быть специфицировано в его интерфейсе ключевым словом throws. Любой код, который в обязательном порядке должен быть выполнен после завершения блока try, помещается в блок finally. Ниже показана общая форма блока обработки исключений. try { // блок кода, в котором отслеживаются ошибки } catch (Тип_исключения_1 exOb) { // обработчик исключений типа ExceptionType1 } catch (Тип_исключения_2 exOb) { // обработчик исключений типа ExceptionType2 } // ... finally { // блок кода, который должен быть выполнен после завершения блока try } Здесь Тип_исключения – тип исключения, которое возникает. Остаток настоящей главы посвящен описанию применения этой программной структуры. Типы исключенийВсе типы исключений являются подклассами встроенного класса Trowable. То есть Trowable расположен на вершине иерархии классов исключений. Немедленно под Trowable в ней находятся два подкласса, которые разделяют все исключения на две отдельные ветви. Одну ветвь возглавляет Exception. Этот класс используется для исключительных условий, которые пользовательская программа должна перехватывать. Это также класс, от которого вы будете наследовать свои подклассы при создании ваших собственных типов исключений. У класса Exception имеется важный подкласс по имени RuntimeException. Исключения этого типа автоматически определяются для программ, которые вы пишете, и включают такие вещи, как деление на ноль и ошибочная индексация массивов. Другая ветвь начинается с класса Error, определяющего исключения, вызов которых не ожидается при нормальном выполнении программы. Исключения типа Error используются системой времени выполнения Java для обозначения ошибок, происходящих внутри самой окружения. Примером такой ошибки может служить переполнение стека. В этой главе не рассматриваются исключения типа Error, поскольку они обычно создаются в ответ на катастрофические сбои, которые не могут быть обработаны вашей программой. Необработанные исключенияПрежде чем вы узнаете, как обрабатывать исключения в своей программе, полезно будет посмотреть, что происходит, когда вы не обрабатываете их. Следующая небольшая программа представляет пример, который намеренно вызывает ошибку деления на ноль: class Exc0 { public static void main(String args[]) { int d = 0; int a = 42 / d; }} Когда система времени выполнения Java обнаруживает попытку деления на ноль, она конструирует новый объект исключения и затем возбуждает исключение. Это прерывает выполнение Exc0, поскольку как только исключение возбуждено, оно должно быть перехвачено обработчиком исключений, а тот должен немедленно с ним что-то сделать. В данном примере мы не применили никакого собственного обработчика исключений, поэтому исключение перехватывается обработчиком по умолчанию, предоставленным системой времени выполнения Java. Любое исключение, которое не перехвачено вашей программой, в конечном итоге будет перехвачено и обработано этим обработчиком по умолчанию. Обработчик по умолчанию отображает строку, описывающую исключение, печатает трассировку стека от точки возникновения исключения и прерывает программу. Трассировка стека всегда покажет последовательность вызовов методов, которая привела к ошибке. |