Курс Java Collections — Лекция: иерархия исключений, errors
— Привет, Амиго!
— Привет, Элли! Как жизнь?
— Отлично, спасибо. А ты как?
— Супер, сегодня утром столько всего нового рассказали.
— Так это же отлично. Не устал?
— Да, есть такое дело. Подустал немного.
— Тогда тебе просто повезло. Потому что хотела тебе сегодня дать большую и сложную тему, но в последний момент передумала и решала рассказать маленькую и легкую.
— Маленькую и легкую? Я готов.
— Сегодня мы с тобой детально разберем тему исключений — Exception.
— Ты про обработку ошибок?
— Считать исключение ошибками – это неверный подход. Исключения больше похожи на отчет о том, «что пошло не так». На основе которого можно предложить альтернативные сценарии действия.
Все дело в методах. Когда ты вызываешь какой-то метод, он гарантированно должен сделать то, для чего его вызвали.
Когда метод по каким-либо причинам не может сделать то, для чего его вызвали, он обязан уведомить об этом вызывающего.
Т.е. самое худшее, что может случиться – это когда метод не выполнил свою работу, и никого об этом не уведомил. Хуже этого не может быть ничего. Это потеря контроля над ситуацией.
Когда ты начинающий программист, тебе кажется, что ты вызываешь методы и они обязательно сделают то, о чем ты их просишь.
Когда ты опытный программист, ты знаешь, что могут быть десятки факторов, которые влияют на выполнение методом своей работы, и возможны очень много различных случаев, когда метод не смог выполнить свою работу.
С точки зрения программиста, если в программе произошел сбой, и она закрылась – это в тысячу раз лучшая ситуация, чем, если в программе произошел сбой, она работает неправильно и пользователь об этом не подозревает.
— Как то, что программа что-то показывает неправильно, может быть хуже, чем, если программа закрылась, и все данные потерялись?
— А с чего ты взял, что программа просто что-то неправильно показывает? Может у нее внутри куча ошибок и все данные твоей работы с ней будут безвозвратно потеряны? Ты 3 часа набирал текст, который не сохранится, потому что на второй минуте работы произошла ошибка.
Когда начинающий программист сталкивается с исключениями, он расстраивается.
Но на самом деле, исключения показывают ему все те сценарии поведения, которые он должен был предусмотреть и не предусмотрел.
Ты можешь не обрабатывать исключения, и тогда — ты плохой программист. Но если твои методы не выкидывают исключений, тогда ты вообще не программист, т.к. так и не понял простой истины:
Метод либо делает то, для чего он написан, либо кидает исключение. Третьего не дано!
— Ладно, верю. Обещаю пользоваться исключениями.
— Отлично. Тогда давай я тебе расскажу про иерархию исключений:
Иерархия исключений базируется на четырех классах.
Самый базовый класс – это Throwable.
От него унаследованы классы Error и Exception.
От Exception унаследован RuntimeException.
Класс Error является базовым классом для ошибок Java-машины, таких как StackOverFlow, OutOfMemory, …
Исправить последствия таких ошибок программа обычно не может, и это приводит к ее завершению.
Действительно, что можно сделать, если для дальнейшей нормальной работы программы не хватает памяти или переполнился стек.
Класс Exception является базовым для всех обычных исключений, которые выбрасываются программой. RuntimeException – это подкатегория исключений Exception, к которым применяются немного другие правила.
— Это какие?
— Как раз сейчас и расскажу.
Как ты, наверное, помнишь, исключения делятся на две категории checked (проверяемые) и unchecked (непроверяемые).
Если метод выкидывает checked исключения, то вызывающий его метод обязан обернуть вызов такого метода в блок try-catch. Ну, или пробросить исключение выше (своему вызывающему), явно указав его в списке throws в сигнатуре метода.
На unchecked такие правила/ограничения не распространяются.
Так вот, все исключения, унаследованные от Exception, считаются checked. Кроме исключений, которые унаследованы от RuntimeException – они unchecked.
— Ага. Вспоминаю, что-то такое мне уже раньше рассказывали.
— Амиго! Иерархию исключений спрашивают на каждом собеседовании. Еще раз – на каждом. Ты должен великолепно знать эту тему.
— Ок. Я еще раз все перечитаю и разберусь. Спасибо, что помогаешь мне, Элли.
Основные типы исключений (Exception) в java — Fandroid.info
Перечень наиболее часто встречающихся исключений (исключительных ситуаций, ошибок) в языке программирования java с расшифровкой их значения.
Содержание
- ArithmeticException
- ArrayIndexOutOfBoundsException
- ArrayStoreException
- ClassCastException
- ConcurrentModificationException
- EmptyStackException
- IllegalArgumentException
- IllegalMonitorStateException
- IllegalStateException
- IllegalThreadStateException
- IndexOutOfBoundsException
- MissingResourceException
- NegativeArraySizeException
- NoSuchElementException
- NullPointerException
- NumberFormatException
- SecurityException
- StringIndexOutOfBoundsException
- UndeclaredThrowableException
- UnsupportedOperationException
Возникла исключительная ситуация, связанная с ошибкой при выполнении арифметического вычисления (например, с попыткой целочисленного деления на нуль). Класс ArithmeticalException унаследован от RuntimeException.
ArrayIndexOutOfBoundsExceptionЗадано значение индекса массива, не принадлежащее допустимому диапазону. Имеется дополнительный конструктор, принимающий в качестве параметра ошибочное значение индекса и включающий его в текст описательного сообщения. Класс ArrayIndexOutOfBoundsException унаследован от IndexOutOfBoundException
ArrayStoreExceptionПредпринята попытка сохранения в массиве объекта недопустимого типа. Возникает, если попытаться записать в ячейку массива ссылку на объект неправильного типа.
Класс ArrayStoreException унаследован от RuntimeException.
ClassCastExceptionВыполнена неверная операция преобразования типов (ошибка приведения типов).
Класс ClassCastException унаследован от RuntimeException.
ConcurrentModificationExceptionОсуществлена попытка изменения объекта конкурирующим потоком вычислений (thread) с нарушением контракта класса (тип определен в пакете jav. util).
Также исключение может происходить при работе с коллекциями при обычной однопоточной работе. ConcurrentModificationException возникает когда коллекция модифицируется «одновременно» с проходом по коллекции итератором любыми средствами кроме самого итератора.
Класс ConcurrentModificationException унаследован от RuntimeException.
EmptyStackExceptionВозникает при попытке извлечения объекта из пустого стека. Тип обладает только конструктором без параметров, поскольку причина ситуации очевидна без дополнительных разъяснений (тип определен в пакете java.util).
Класс EmptyStackExceptionунаследован от RuntimeException.
IllegalArgumentExceptionМетоду передано неверное значение аргумента (например, отрицательное, когда метод предполагает задание положительных значений).
Класс IllegalArgumentExceptionунаследован от RuntimeException.
IllegalMonitorStateExceptionВыполнено обращение к методу wait, notifyAll или notify объекта, когда текущий поток вычислений не обладает блокировкой (lock) этого объекта.
Класс IllegalMonitorStateException унаследован от RuntimeException.
IllegalStateExceptionПредпринята попытка выполнения операции в то время, когда объект не находится в соответствующем состоянии (например при регистрации или удалении ловушки события закрытия исполняющей системы (shutdown hook) после начала процедуры закрытия).
Класс IllegalStateExceptionунаследован от RuntimeException.
IllegalThreadStateExceptionПредпринята попытка выполнения операции в то время, когда объект потока вычислений не находится в соответствующем состоянии (например, вызван метод start для потока, который уже приступил к работе).
Класс IllegalThreadStateException унаследован от IllegalArgumentException
IndexOutOfBoundsExceptionЗадано значение индекса массива или содержимого строки типа String, не принадлежащее допустимому диапазону.
Класс IndexOutOfBoundsException унаследован от RuntimeException
MissingResourceExceptionНе найден требуемый ресурс или пакет ресурсов (resource bundle). Единственный конструктор типа предусматривает задание трех аргументов: строки описательного сообщения, наименования класса ресурсов и объекта ключа, отвечающего отсутствующему ресурсу. Для получения строк наименования класса и ключа применяются методы detClassName и getKey соответственно (тип определен в пакете java.util).
Класс MissingResourceExceptionунаследован от RuntimeException.
NegativeArraySizeExceptionПредпринята попытка создания массива с размером, значение которого задано отрицательным числом.
Класс NegativeArraySizeException унаследован от RuntimeException.
NoSuchElementExceptionОперация поиска элемента в объекте одного из контейнерных классов завершилась неудачей (тип определен в пакете java.util).
Класс NoSuchElementException унаследован от RuntimeException.
NullPointerExceptionВозникает при попытке обращения к полю, методу или объекту по ссылке, равной null. Также исключение выбрасывается, когда метод, не допускающий передачи аргумента null, был вызван с заданием значения null. В последнем случае может быть сгенерировано и исключение типа IllegalArgumentException.
Класс NullPointerException унаследован от RuntimeException.
NumberFormatExceptionСтрока, которая, как предполагалось должна содержать представление числа, не отвечает этому требованию. Исключение выбрасывается такими методами, как, например, Integer.parseInt.
Класс NumberFormatException унаследован от IllegalArgumentException.
SecurityExceptionПредпринята попытка выполнения операции, запрещенной системой обеспечения безопасности в соответствии с действующей политикой безопасности.
Класс SecurityException унаследован от RuntimeException.
StringIndexOutOfBoundsExceptionЗадано значение индекса содержимого строки типа String, не принадлежащее допустимому диапазону. Имеется дополнительный конструктор, принимающий в качестве параметра ошибочное значение индекса и включающий его в текст описательного сообщения.
Класс StringIndexOutOfBoundsException унаследован от IndexOutOfBoundsException.
UndeclaredThrowableExceptionВыбрасывается при обращении к методу целевого объекта посредством объекта рефлективного класса Proxy, если метод invoke объекта InvocationHandler генерирует объявляемое исключение, которое не допускает присваивания ни одному из типов исключений, упомянутых в предложении throws метода целевого объекта. Рассматриваемое исключение содержит ссылку на исключение, генерируемое методом invoke, которое может быть получено с помощью метода getUndeclaredThrowable. Класс исключений UndeclaredThrowableException поддерживает два конструктора: оба принимают в качестве параметров ссылку на объект Throwable, а один из них, помимо того, строку описания (тип определен в пакете java.lang.reflect).
Класс UndeclaredThrowableException унаследован от RuntimeException.
UnsupportedOperationExceptionПредпринята попытка выполнения операции над объектом, который ее не поддерживает (например, модификация объекта, обозначенного признаком «только для чтения»). используется также классами коллекций из состава пакета java.util как реакция на вызов методов производного класса, реализация которых не обязательна.
Класс UnsupportedOperationException унаследован от RuntimeException.
Смотрите также: Методы обработки исключений в java
Иерархия исключений в Java
Во введении к исключениям мы упомянули что исключения Java также являются объектами. Поскольку они являются объектами, различные типы исключений могут иметь разные подклассы исключений . Например, мы упоминали, что FileNotFoundException является расширением IOException. Зачем нам создавать исключения как подклассы других «главных» классов исключений таким образом? Во-первых, создание такой иерархии может быть чрезвычайно полезным, когда речь идет о отлов исключений. Если мы поймаем IOException, то косвенно мы также перехватываем FileNotFoundException. Программист может решить какой уровень детализации им нужен при организации их блоков улова.
В дополнение к любой иерархии, которая может быть определена в конкретной программе или библиотеке, Классы исключений Java организованы в фундаментальную иерархию на самом верхнем уровне. Там — это базовый класс исключений, который называется Exception, как и следовало ожидать. Но в на самом деле, основа иерархии начинается не с Exception, а с класс с именем Throwable, который затем является подклассом Exception и Ошибка. Часть этой фундаментальной иерархии показана на рисунке 1.
Рисунок 1: Основа иерархии исключений Java. Типы в красный и их подклассы представляют непроверенных исключения которые не нужно явно объявлять и перехватывать (см. ниже).
Почему существуют различные типы базовых классов исключений, настроенные таким образом, и какой тип «исключения» вы должны использовать, когда? Ответ сводится к тому, как ваша программа ожидает обработки (или нет) рассматриваемого условия. В качестве общего руководства, вот как вы обычно должны использовать различные типы классов исключений:
- Подклассы исключений представляют собой ошибки, которые программа может обоснованно оправиться от. За исключением RuntimeException и его подклассов (см. ниже), они обычно представляют собой ошибки, которые программа ожидает происходить в ходе обычной работы : например, подключение к сети ошибки и ошибки файловой системы.
- Подклассы ошибок представляют «серьезные» ошибки, которые программа обычно не должен ожидать, что он поймает и восстановится с . К ним относятся условия например, ожидаемый файл класса отсутствует или ошибка OutOfMemoryError.
- RuntimeException является еще одним подклассом Exception.
RuntimeException и его подклассы немного отличаются: они
представляют исключения, которые программа обычно не должна ожидать,
но потенциально может восстановиться с . Они представляют то, что может быть
В действительности существуют исключения из этого использования. Например, бывают случаи, когда организация библиотек JDK означает, что мы должны поймать исключение, которое, как мы по существу знаем, никогда не произойдет. И есть некоторые случаи где нам «нечего терять», пытаясь поймать ошибку, хотя мы, возможно, на самом деле не сможем на практике.
Проверенные и непроверенные исключения
Выше мы упоминали, что некоторые исключения обычно указывают на программирование ошибка , а не ошибки, которые мы могли бы ожидать при нормальном ходе События. (Принимая во внимание, что для программиста разумно ожидать, что сеть или время от времени будет возникать ошибка файловой системы.) Мы также упоминали, что подклассы Error не обязательно ошибки программирования, но все же ошибки, которые мы на самом деле не ожидаем в обычном ходе событий.
Функция, встроенная в язык Java, состоит в том, что Ошибка с и RuntimeException с (и их подклассы, отмеченные красным на рис. 1) — это так называемые непроверенных исключения :
- непроверенные исключения могут быть выброшены «в любое время»;
- методы не должны явно объявлять , что они могут генерировать непроверенное исключение;
- вызывающим абонентам не нужно обрабатывать их явно.
На следующей странице мы более подробно рассмотрим непроверенные исключения в Java.
Если вам понравилась эта статья по программированию на Java, поделитесь ею с друзьями и коллегами. Следите за автором в Твиттере, чтобы быть в курсе последних новостей и разглагольствований. Подпишитесь на @BitterCoffey
Контент редакционной страницы, написанный Нилом Коффи. Copyright © Javamex UK 2021. Все права защищены.
Иерархия исключений в Java | Типы исключений
В этом руководстве мы изучим иерархию исключений в Java с диаграммами и краткими описаниями.
В предыдущем руководстве мы объяснили основные моменты обработки исключений и обработчик исключений в Java с примерами в реальном времени.
Рекомендую сначала ознакомиться с основными моментами.
Типы исключений в Java
По сути, в Java API существует два типа исключений. Это:
- Предопределенные исключения (Встроенные исключения)
- Пользовательские исключения
Предопределенные исключения:
Предопределенные исключения — это те исключения, которые уже определены системой Java. Эти исключения также называются встроенными исключениями.
Java API поддерживает обработку исключений, предоставляя количество предопределенных исключений. Эти предопределенные исключения представлены классами в java.
При возникновении предопределенного исключения JVM (система выполнения Java) создает объект предопределенного класса исключения. Все исключения являются производными от класса java. lang.Throwable, но не все классы исключений определены в одном пакете.
Все предопределенные исключения, поддерживаемые java, организованы как подклассы в иерархии класса Throwable.
Класс Throwable является корнем иерархии исключений и является непосредственным подклассом класса Object. Давайте разберемся с иерархией исключений Java, как показано на рисунке ниже.
1. Класс Throwable: Как показано на рисунке выше, класс Throwable, производный от класса Object, является вершиной иерархии исключений, из которой прямо или косвенно выводятся все классы исключений. Это корень всех классов исключений. Он присутствует в пакете java.lang.
Класс Throwable является надклассом всех исключений в java. Этот класс имеет два подкласса: Error и Exception. Ошибки или исключения, возникающие в java-программах, являются объектами этих классов. Используя класс Throwable, вы также можете создавать свои собственные исключения.
2. Ошибка: Класс ошибок является подклассом класса Throwable и надклассом всех классов ошибок времени выполнения. Он завершает программу, если есть проблема, связанная с системой или ресурсами (JVM).
Ошибка обычно представляет собой необычную проблему или ситуацию, после которой ее трудно исправить. Это не происходит из-за ошибок программиста. Обычно это происходит, если система не работает должным образом или ресурсы не распределены должным образом.
VirtualMachineError, StackOverFlowError, AssertionError, LinkageError, OutOfMmeoryError и т. д. являются примерами ошибок. Мы узнаем больше подробностей в дальнейших уроках.
3. Исключение: Оно представлено классом Exception, который представляет ошибки, вызванные программой и внешними факторами. Класс исключений является подклассом класса Throwable и суперклассом всех классов исключений.
Все классы исключений прямо или косвенно являются производными от класса исключений. Они происходят внутри приложения.
Класс исключений предоставляет два конструктора:
- public Exception() (конструктор по умолчанию)
- public Exception(String message) (принимает строку сообщения в качестве аргумента)
Каждый из классов исключений предоставляет два конструктора: один без аргумента и еще один с аргументом типа String. Класс исключения не предоставляет собственного метода. Он наследует все методы, предоставляемые классом Throwable.
Иерархия классов исключений в Java
Мы можем видеть иерархию классов исключений в Java на рисунке ниже, что очень важно для интервью.
Пользовательские исключения:
Пользовательские исключения — это те исключения, которые создаются пользователями или программистами в соответствии с их собственными потребностями. Пользовательские исключения также называются определяемыми пользователем исключениями, которые создаются путем расширения класса исключений.
Таким образом, Java предоставляет программистам свободу создавать и обрабатывать исключения при работе с функциональными требованиями решаемых ими проблем. Мы обсудим более подробно пользовательские исключения в дальнейших руководствах.
Давайте посмотрим краткое описание каждого подкласса класса Exception.
Класс RuntimeException (непроверенные исключения)
Класс RuntimeException является подклассом класса Exception. Он генерируется JVM или программно, когда арифметическая операция, выполненная в программе, неверна или в коде программы возникает дефект/ошибка.
Компилятор Java не проверяет RuntimeException и все его подклассы исключений, поскольку они возникают во время выполнения программы. Вот почему эти исключения также называются непроверенными исключениями.
Класс RuntimeException состоит из многих других подклассов исключений, которые используются для обработки исключений определенного типа.
Помимо этих подклассов исключений класса RuntimeException, показанных на рисунке выше. Существуют и другие подклассы класса RuntimeException, которые не показаны на диаграмме структуры иерархии, чтобы избежать сложности.
Давайте посмотрим их краткое описание.
1. ArithmeticException: Это исключение выдается при возникновении арифметических проблем, таких как деление числа на ноль. То есть это вызвано математической ошибкой.
2. ClassCastException: ClassCastException — это исключение времени выполнения, которое генерируется JVM, когда мы пытаемся выполнить недопустимое приведение типов в программе. То есть он выбрасывается, когда мы приводим объект к подклассу, экземпляром которого объект не является.
3. IllegalArgumentException: Это исключение времени выполнения генерируется программно, когда для вызова метода передается недопустимый или подходящий аргумент. Этот класс исключений имеет еще два подкласса:
- NumberFormatException
- IllegalThreadStateException
NumericFormatException: NumberFormatException генерируется программно, когда мы пытаемся преобразовать строку в числовой тип, и процесс незаконного преобразования завершается неудачно. То есть возникает из-за нелегального преобразования строки в числовой формат.
IllegalThreadStateException: Исключение IllegalThreadStateException — это исключение времени выполнения, которое генерируется программно, когда мы пытаемся выполнить какую-либо операцию на поток , но он несовместим с текущим состоянием потока.
4. IndexOutOfBoundsException: Этот класс исключения генерируется JVM, когда массив или строка выходит за пределы указанного индекса. Он имеет еще два подкласса:
- ArrayIndexOutOfBoundsException
- StringIndexOutOfBoundsException
ArrayIndexOutOfBoundsException: Исключение ArrayIndexOutOfBoundsException выдается при доступе к элементу массива из индекса.
StringIndexOutOfBoundsException: Исключение StringIndexOutOfBoundsException возникает при доступе к элементу String или StringBuffer из индекса.
5. NullPointerException: NullPointerException — это исключение времени выполнения, которое генерируется JVM, когда мы пытаемся использовать null вместо объекта. То есть он выбрасывается, когда ссылка имеет значение null.
6. ArrayStoreException: Это исключение возникает, когда мы пытаемся сохранить любое значение в массиве, который не имеет типа массива. Например, предположим, массив имеет целочисленный тип, но мы пытаемся сохранить значение элемента другого типа.
7. IllegalStateException: Исключение IllegalStateException генерируется программно, когда среда выполнения не находится в подходящем состоянии для вызова какого-либо метода.
8. IllegalMonitorStateException: Это исключение возникает, когда поток не имеет права отслеживать объект и пытается получить доступ к методам wait(), notify() и notifyAll() объекта.
9. NegativeArraySizeException: Исключение NegativeArraySizeException возникает, когда массив создается с отрицательным размером.
Список проверенных исключений в Java
Теперь мы перечислили проверенные исключения в кратком описании.
1. ClassNotFoundException: ClassNotFoundException — это своего рода проверенное исключение, которое возникает, когда мы пытаемся использовать несуществующий класс.
Проверяемые исключения — это те исключения, которые проверяются самим компилятором Java.
2. FileNotFoundException: FileNotFoundException — это проверенное исключение, которое выдается, когда мы пытаемся получить доступ к несуществующему файлу.
3. InterruptedException: InterruptedException — это проверенное исключение, которое генерируется, когда поток находится в спящем или ожидающем состоянии, а другой поток пытается его прервать.
4. InstantiationException: Это исключение также является проверенным исключением, которое возникает, когда мы пытаемся создать объект абстрактного класса или интерфейса.
То есть исключение InstantiationException возникает при создании экземпляра абстрактного класса или интерфейса.5. Исключение IllegalAccessException: Исключение IllegalAccessException является проверенным исключением и возникает, когда метод вызывается в другом методе или классе, но у вызывающего метода или класса нет разрешения на доступ к этому методу.
6. CloneNotSupportedException: Это проверенное исключение возникает, когда мы пытаемся клонировать объект без реализации клонируемого интерфейса.
7. NoSuchFieldException: Это проверенное исключение, которое возникает, когда в программе используется неизвестная переменная.
8. NoSuchMethodException: Это проверенное исключение возникает, когда в программе используется неопределенный метод.
Ключевые моменты, которые следует помнить:
- Два типа исключений в Java: предопределенные и настраиваемые исключения.