Главная » Java » Типы исключений RuntimeException и Error

0

   

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

но вот чего ему по-настоящему не хватает,

так это удивленно приподнятых или сердито сдвинутых бровей.

Фрэнк Заппа

 

   Исполняющая система способна выбрасывать объекты исключений (exceptions) двух основных семейств типов — производных от RuntimeException либо расширяющих класс ошибок Error. Эти исключения, как было определено в главе 8, относятся к категории необъявляемых. Вот как выглядят несколько верхних уровней иерархии типов исключений Java.

   Исключения типов Error свидетельствуют о весьма серьезных ошибках, которые не могут быть отловлены (либо допускают такую возможность в редких случаях и с немалым трудом), а их последствия, как правило, не поддаются преодолению. Типы Error не являются наследниками класса RuntimeException, так что если даже вы и вознамеритесь предусмотреть предложения catch для поимки всех исключений Exception или RuntimeException (что зачастую нельзя считать хорошим решением), исключения Error все равно от вас "ускользнут". Предложения finally конструкций try, разумеется, выполняются при возникновении любых исключений — в том числе и Error, — так что программа всегда сможет выполнить некоторый набор необходимых завершающих операций.

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

   Большинство типов RuntimeException и Error поддерживает, самое меньшее, по два конструктора: первый не предусматривает задания параметров, а второй в качестве параметра принимает объект String с содержательным описанием природы ошибки. Строка описания может быть получена с помощью методов getMessage либо getLocalizedMessage (последний возвращает локализованный вариант строки).

   Приложение состоит из двух разделов: в первом перечислены классы семейства RuntimeException, а во втором — Error. Упоминание каждого типа исключения сопровождается описанием его назначения, вероятной причины возникновения и дополнительных конструкторов, если таковые предусмотрены. Если тип не является частью пакета java.lang, мы указываем наименование соответствующего пакета явно. Внимания удостоены только те исключения, которые относятся к пакетам, рассмотренным ранее.

А.1. Классы RuntimeException

 

ArithmeticException extends  RuntimeException

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

ArrayindexOutOfBoundsException extends indexoutofBoundsException

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

ArraystoreException extends RuntimeException

Предпринята попытка сохранения в массиве объекта недопустимого типа.

ClassCastException extends RuntimeException

Выполнена неверная операция преобразования типов.

ConcurrentModificationException extends RuntimeException

Осуществлена попытка изменения объекта конкурирующим потоком вычислений (thread) с нарушением контракта класса (тип определен в пакете Java.util).

EmptyStackException extends  RuntimeException

Выполнена операция выталкивания (pop) значения из пустого стека. Ти] обладает только конструктором без параметров, поскольку причин; ситуации очевидна без дополнительных разъяснений (тип определен в nai кете Java. util).

IllegalArgumentException extends RuntimeException

Методу передано неверное значение аргумента (например, отрицательное, когда метод предполагает задание положительных значений).

IllegalMonitorStateException extends RuntimeException

Выполнено обращение к методу wait, notifyAll или notify объекта, когдг текущий поток вычислений не обладает блокировкой (lock) этого объекта.

IllegalStateException extends RuntimeException

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

IllegalThreadStateException extends IllegalArgumentException

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

IndexOutOfBoundsException extends RuntimeException

Задано значение индекса массива или содержимого строки типа String, не принадлежащее допустимому диапазону.

MissingResourceException extends RuntimeException

Не найден требуемый ресурс или пакет ресурсов (resource bundle). Единственный конструктор типа предусматривает задание трех аргументов: строки описательного сообщения, наименования класса ресурсов и объекта ключа, отвечающего отсутствующему ресурсу. Для получения строк наименования класса и ключа применяются методы getClassName и getKey соответственно (тип определен в пакете Java.util).

NegativeArraySizeException extends RuntimeException

Предпринята попытка создания массива с размером,  значение которого задано в виде отрицательного числа.

 NoSuchElementException extends RuntimeException

Операция  поиска элемента в  объекте  одного  из  контейнерных  классов завершилась неудачей (тип определен в пакете Java.util).

NullPointerException extends  RuntimeException

Для доступа к полю или методу была применена ссылка, равная null. Исключение выбрасывается и в той ситуации, когда метод, не допускающий передачи аргумента null, был вызван с заданием значения null. В  последнем случае может быть сгенерировано и исключение типа IllegalArgumentException.

NumberFormatException extends  illegalArgumentException

Строка, которая, как предполагалось, должна содержать представление числа, не отвечает этому требованию. Исключение выбрасывается такими методами, как, например, Integer.parseint.

SecurityException extends RuntimeException

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

StringindexOutOfBoundsException extends  indexOutOfBounds Exception

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

UndeclaredThrowableException extends RuntimeException

Выбрасывается при обращении к методу целевого объекта посредством объекта рефлективного класса Proxy, если метод invoke объекта invocationHandler генерирует объявляемое исключение, которое не допускает присваивания ни одному из типов исключений, упомянутых в предложении throws метода целевого объекта. Рассматриваемое исключение содержит ссылку на исключение, генерируемое методом invoke, которое может быть получено с помощью метода getundeclaredThrowable. Класс исключений UndeclaredThrowableException поддерживает два конструктора: оба принимают в качестве параметров ссылку на объект Throwable, а один из них, помимо того, строку описания (тип определен в пакете java.lang.reflect).

UnsupportedOperationException extends RuntimeException

Предпринята попытка выполнения операции над объектом, который ее не поддерживает (например, модификации объекта, обозначенного признаком "только для чтения"). Используется также классами коллекций из состава пакета java.util как реакция на вызов методов производного класса, реализация которых не обязательна.

 

А.2. Классы Error

 

AbstractMethodError extends incompatibleClassChangeError

 Вызван абстрактный метод класса, не содержащий реализации.

ClassCircularityErrorextends  LinkageError

В процессе инициализации класса выявлены циклические ссылки.

ClassFormatError extends  LinkageError

Загружаемый класс или интерфейс определен в неверном формате.

ExceptionlnlnitializerError extends  LinkageError

В процессе инициализации выброшено необрабатываемое исключение (uncaught exception). Имеется дополнительный конструктор, который в качестве параметра принимает объект необрабатываемого исключения (тот может быть получен посредством метода getException) и сохраняет ссылку на него в текущем объекте.

IllegalAccessError extends IncompatibleClassChangeError

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

 

IncompatibleClassChangeError extends  LinkageError

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

instantiationError extends  IncompatibleClassChangeError

Предпринята попытка создания экземпляра интерфейса или абстрактного класса.

internalErrorextends Vi rtualMachineError

Выявлена внутренняя ошибка периода выполнения (исключение относится к разряду тех, которые "не должны возникать никогда").

LinkageError extends Error

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

NoClassDefFoundError extends  LinkageError

Определение класса не найдено.

NoSuchFieldError extends  IncompatibleClassChangeError

Определение поля в объявлении класса или интерфейса не найдено.

NoSuchMethodError extends  IncompatibleClassChangeError

Определение метода в объявлении класса или интерфейса не найдено.

OutOfMemoryError extends virtualMachineError

Виртуальная машина не в состоянии выделить требуемый фрагмент памяти.

StackOverflowError extends vi rtualMachineError

Произошло переполнение стека вызовов (такая ситуация может свидетельствовать о бесконечном рекурсивном цикле в программе).

ThreadDeath extends  Error

Объект типа ThreadDeath выбрасывается потоком вычислений при вызове метода thread, stop. Если объект отлавливается, он должен быть выброшен повторно; если же объект не подвергается обработке, он обычно не заявляет о своем существовании. В составе класса имеется только конструктор без параметров, но объекты класса, как правило, никогда не создаются непосредственно.

UnknownError extends vi rtualMachineError

Выявлена серьезная ошибка неизвестного характера.

UnsatisfiedLinkError extends  LinkageError

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

 UnsupportedclassversionError extends ClassFormatError

              Версия загруженного класса не поддерживается виртуальной машиной.

VerifyError extends  LinkageError

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

virtualMachineError extends  Error

Обнаружена   внутренняя   ошибка  виртуальной   машины   либо   последняя исчерпала с              истемные ресурсы.

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

По теме:

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