Перейти к основному содержимому

Иерархия классов исключений в Java

Разработчику Архитектору

Корневая структура иерархии исключений

Все исключения в Java представляют собой объекты, наследуемые от корневой системы java.lang.Throwable. Эта система обеспечивает централизованную обработку ошибок на уровне виртуальной машины.

Композитная структура включает две фундаментальные ветви наследования:

  • исключения (Exception)
  • ошибки (Error).
Throwable
├── Error
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ └── NoClassDefFoundError
└── Exception
├── RuntimeException (непроверяемые)
│ ├── ArithmeticException
│ ├── NullPointerException
│ ├── ArrayIndexOutOfBoundsException
│ ├── ClassCastException
│ └── IllegalArgumentException
└── (проверяемые исключения)
├── IOException
├── SQLException
└── ClassNotFoundException

Обе категории унаследованы непосредственно от класса Throwable.

Класс Throwable

java.lang.Throwable — корневой класс всей системы исключений в Java. Все объекты, представляющие ошибки или отклонения от нормального выполнения программы, должны наследовать именно этот класс. Конструкторы класса позволяют передавать сообщение об ошибке и ссылку на исключение-причину.

Поля класса:

  • detailMessage — текстовое описание состояния возникновения ошибки
  • cause — ссылка на исходное исключение, вызвавшее текущую ошибку

Методы класса:

  • printStackTrace() — выводит стек вызовов в стандартный поток ошибок
  • getMessage() — возвращает текстовую форму сообщения ошибки
  • getCause() — возвращает объект исключения-причины
  • toString() — строковое представление объекта исключения

Пример использования:

try {
// оперируем ресурсом
} catch (Throwable t) {
System.out.println(t.getMessage());
t.printStackTrace();
}

Класс Error

java.lang.Error — базовый класс для проблем серьёзного уровня, которые обычно возникают на уровне виртуальной машины. Разработчик программного кода не должен пытаться перехватывать эти случаи программно, поскольку они указывают на критические проблемы среды выполнения.

Характеристики класса:

  • Не предназначена для обработки операторами try-catch
  • Возникают при исчерпании системных ресурсов
  • Требуют вмешательства оператора или администратора системы

Класс Exception

java.lang.Exception — базовый класс для всех ситуаций, которые программа может обработать программным путём. Компилятор Java проверяет наличие обработки этих исключений перед сборкой проекта. Это гарантирует что разработчик осознаёт возможные ситуации отклонения от нормального хода программы.


Полный справочник по классам java.lang.Error

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

AssertionError

Пакет: java.lang

Наследование:

Предназначение: Указывает на отказ проверки утверждений в коде. Используется директивами assert для внутренней верификации логических условий внутри программы.

Сценарии возникновения:

  • Проверка внутренних предположений программы не пройдена
  • Нарушение контрактов методов или классов
  • Состояние объекта не соответствует ожиданиям разработчика

Пример появления:

assert x >= 0 : "Значение должно быть положительным";
// Если условие ложно, выбрасывается AssertionError

Рекомендации:

  • Используйте только для внутренней диагностики логики программы
  • Не перекладывайте ответственность за валидацию входных данных на утверждения
  • Отключайте проверку утверждений с помощью флага -disableassertions в режиме production

LinkageError

Пакет: java.lang

Наследование:

Предназначение: Сообщает о проблемах при загрузке классов в рантайме. Возникает при несоответствии между кодом и загружаемыми классами.

Подклассы:

ПодклассОписание
BootstrapMethodErrorОшибка при выполнении bootstrap методов
ClassCircularityErrorКласс ссылается сам на себя через цепочку наследования
ClassFormatErrorНарушена структура байт-кода класса
IncompatibleClassChangeErrorИзменены сигнатуры методов или полей класса
NoSuchFieldErrorКласс запрашивает поле, которого нет
NoSuchMethodErrorКласс запрашивает метод, которого нет
VerifyErrorВалидация байт-кода завершена неудачей

Сценарии возникновения:

  • Версионные конфликты библиотек
  • Модификация классов во время работы приложения
  • Несовместимость компиляции и исполнения

Пример появления:

// Класс был перекомпилирован после загрузки другого
String s = new SomeClass().nonExistentMethod();
// Вызовет NoSuchMethodError если метод удалён в новой версии

NoClassDefFoundError

Пакет: java.lang

Наследование:

Предназначение: Возникает когда JVM пытается использовать класс, но не может найти его определение в пути загрузки классов.

Отличие от ClassNotFoundException:

  • ClassNotFoundException возникает программно при попытке загрузить класс через Reflection
  • NoClassDefFoundError возникает автоматически во время выполнения кода

Причины возникновения:

  • Отсутствует JAR файл в библиотеках проекта
  • Класс определён в другом модуле или проекте
  • Проблемы с маршрутом загрузки классов

Пример проявления:

// При запуске без указания класса в classpath
SomeClass obj = new SomeClass();
// Вызовет NoClassDefFoundError

OutOfMemoryError

Пакет: java.lang

Наследование:

Предназначение: Сообщает о невозможности выделить память для новых объектов.

Типы памяти, связанные с ошибкой:

ТипОписание
Heap spaceОсновная куча JVM для объектов
MetaspaceХранилище метаданных классов
Thread stacksПамять стеков потоков
Code cacheКэш машинного кода JIT компилятора

Стратегии обработки:

  • Увеличение параметров -Xmx и -Xms для JVM
  • Оптимизация использования памяти в коде
  • Мониторинг потребления памяти профилями
  • Перезапуск приложения при критической ошибке

Пример проявления:

List<byte[]> objects = new ArrayList<>();
while (true) {
objects.add(new byte[10 * 1024 * 1024]); // 10 МБ на каждый элемент
}
// Вызовет OutOfMemoryError при исчерпании памяти

StackOverflowError

Пакет: java.lang

Наследование:

Предназначение: Сообщает о превышении допустимого размера стека вызовов потоками программы.

Основные причины возникновения:

  • Бесконечная рекурсия функций
  • Циклические вызовы методов между классами
  • Слишком глубокая вложенность вызовов
  • Недостаточный размер параметра -Xss

Пример проявления:

void recursiveCall() {
recursiveCall(); // Бесконечная рекурсия
}
recursiveCall(); // Вызовет StackOverflowError

Стратегии профилактики:

  • Анализ глубины рекурсии перед реализацией
  • Использование итерационных подходов вместо рекурсивных
  • Увеличение лимита стека через JVM параметры
  • Рефакторинг кода для уменьшения вложенности

VirtualMachineError

Пакет: java.lang

Наследование:

Предназначение: Базовый класс для ошибок самой виртуальной машины Java. Эти ошибки указывают на внутренние неполадки среды выполнения.

Подклассы:

ПодклассОписание
InternalErrorВнутренняя ошибка JVM
OutOfMemoryErrorИсчерпание выделенной памяти
StackOverflowErrorПревышение размеров стека потока
UnknownErrorНеопределённая ошибка виртуальной машины

Рекомендации:

  • Не обрабатывать программно
  • Логируйте полную информацию об инциденте
  • Обращайтесь к документации JVM для диагностики
  • Применяйте мониторинг производительности

Полный справочник по проверяемым исключениям (checked exceptions)

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

ClassNotFoundException

Пакет: java.lang

Наследование:

Предназначение: Возникает когда код ищет класс по имени, но не может найти его определение в доступных путях.

Основные сценарии:

  • Отсутствие JAR файла в classpath
  • Опечатка в полном названии класса
  • Класс доступен только в другой версии библиотеки

Пример применения:

try {
Class<?> cls = Class.forName("com.example.SomeClass");
} catch (ClassNotFoundException e) {
// Класс отсутствует в системе
System.err.println("Класс не найден: SomeClass");
}

Варианты обработки:

  • Проверка существования файлов в директории проекта
  • Валидация конфигурационных настроек
  • Динамическая загрузка классов из внешних источников

CloneNotSupportedException

Пакет: java.lang

Наследование:

Предназначение: Возникает когда класс не поддерживает клонирование через интерфейс Cloneable.

Условия возникновения:

  • Класс не реализует интерфейс Cloneable
  • Переопределение метода clone() без объявления throws
  • Запрет клонирования на уровне бизнес-логики

Пример реализации:

public class NotCloneable implements Cloneable {
@Override
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException("Клонирование запрещено");
}
}

IllegalAccessException

Пакет: java.lang

Наследование:

Предназначение: Указывает на попытку доступа к компоненту с ограниченной видимостью.

Основные варианты:

  • Доступ к приватным полям или методам
  • Попытка создания экземпляра закрытого класса
  • Нарушение ограничений пакета

Пример использования:

PrivateClass obj = new PrivateClass();
obj.setField(publicAccess); // Нарушает инкапсуляцию

Стратегии решения:

  • Использование публичных API вместо рефлексии
  • Открытие классов через модульную систему Java
  • Применение методов setter/getter

InstantiationException

Пакет: java.lang

Наследование:

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

Причины возникновения:

  • Попытка инстанцировать абстрактный тип
  • Отсутствует конструктор без параметров
  • Конструктор объявлен как private

Пример проявления:

AbstractClass obj = (AbstractClass) Class.newInstance();
// Вызовет InstantiationException если абстрактный

Рекомендации:

  • Создавайте экземпляры конкретных подклассов
  • Используйте фабричные методы или DI контейнеры
  • Применяйте паттерн Factory Method

InterruptedException

Пакет: java.lang

Наследование:

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

Основные источники:

  • Методы sleep(), wait(), join()
  • Операторы блокировки потоков
  • Сервисы планировщики задач

Правильная обработка:

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
// Сохраняем состояние прерывания
return;
}

Важные аспекты:

  • Всегда сохраняйте флаг прерывания потока
  • Прекращайте выполнение немедленно после перехвата
  • Не игнорируйте это исключение

NoSuchFieldException

Пакет: java.lang

Наследование:

Предназначение: Возникает при попытке получить доступ к полю, которого не существует в классе.

Сценарии возникновения:

  • Опечатка в имени поля
  • Поле удалено в обновлении версии
  • Поле доступно только в родительском классе

Пример использования:

try {
Field f = MyClass.class.getDeclaredField("nonexistent");
} catch (NoSuchFieldException e) {
System.err.println("Поле не найдено");
}

NoSuchMethodException

Пакет: java.lang

Наследование:

Предназначение: Сообщает что запрошенный метод не найден в классе.

Варианты применения:

  • Поиск метода по именному идентификатору
  • Вызов метода через рефлексию
  • Интеграция с динамическими API

Пример применения:

try {
Method m = MyClass.class.getMethod("nonexistentMethod");
} catch (NoSuchMethodException e) {
System.err.println("Метод отсутствует");
}

IOException

Пакет: java.io

Наследование:

Предназначение: Базовый класс для всех исключений ввода-вывода. Покрытие операций чтения и записи файлов, сетевых подключений.

Основные подклассы:

ПодклассОписание
EOFExceptionДостигнут конец файла преждевременно
FileNotFoundExceptionФайл не обнаружен
InterruptedIOExceptionОперация прервана
MalformedURLExceptionНекорректный URL адрес
ProtocolExceptionОшибка протокола сети
SocketTimeoutExceptionТаймаут сетевого соединения
SyncFailedExceptionСинхронизация ресурса не удалась
UnknownHostExceptionУзел сети недоступен
URISyntaxExceptionНеверный формат URI

Пример обработки:

try (FileReader reader = new FileReader("Данные.txt")) {
int charData = reader.read();
} catch (FileNotFoundException e) {
System.err.println("Файл не найден");
} catch (IOException e) {
System.err.println("Ошибка чтения");
}

Рекомендации:

  • Всегда используйте try-with-resources
  • Логгируйте детали ошибки
  • Предусматривайте альтернативные пути

ReflectiveOperationException

Пакет: java.lang

Наследование:

Предназначение: Базовый класс для всех исключений связанных с рефлексией. Группирует ошибки при работе с мета-данными классов во время выполнения.

Дочерние исключения:

  • ClassNotFoundException
  • IllegalAccessException
  • InstantiationException
  • InvocationTargetException
  • NoSuchFieldException
  • NoSuchMethodException

Сценарии использования:

  • Метапрограммирование во время выполнения
  • Динамическое создание объектов
  • Анализ структуры классов
  • Автоматическое тестирование компонентов

InvocationTargetException

Пакет: java.lang

Наследование:

Предназначение: Возникает когда метод вызывает другую операцию и происходит ошибка внутри этого метода.

Особенности обработки:

  • Получение исходной ошибки через getCause()
  • Определение причины исключения в методе
  • Воспроизведение результата в основном потоке

Пример использования:

try {
method.invoke(obj, args);
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
System.err.println("Ошибка в целевом методе: " + cause);
}

Полный справочник по непроверяемым исключениям (unchecked exceptions)

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

ArithmeticException

Пакет: java.lang

Наследование:

Предназначение: Сообщает об арифметической ошибке вычисления.

Основные типы ошибок:

  • Деление на ноль для целых чисел
  • overflow целочисленных операций
  • недопустимые математические операции

Пример появления:

int result = 10 / 0; // Вызовет ArithmeticException

Стратегии предотвращения:

  • Валидация делителя перед операцией
  • Использование проверок границ значений
  • Применение больших типов данных при необходимости

ArrayIndexOutOfBoundsException

Пакет: java.lang

Наследование:

Предназначение: Возникает при обращении к индексу массива вне допустимых границ.

Допустимые диапазоны:

УсловиеЗначение
Правый индекс[0...length-1]
Нижний предел0 включительно
Верхний пределlength-1 включительно

Пример проявления:

int[] Данные = new int[5];
System.out.println(Данные[5]); // Вызовет исключение

Превентивные меры:

  • Проверка границ перед доступом
  • Использование циклов с правильными условиями
  • Применение коллекций вместо массивов

ClassCastException

Пакет: java.lang

Наследование:

Предназначение: Возникает при попытке привести объект к типу который он не является.

Основные причины:

  • Неправильная каст类型 после получения объекта
  • Потеря информации при приведении
  • Изменение иерархии классов

Пример появления:

Object o = new String();
Integer i = (Integer) o; // Вызовет ClassCastException

Стратегии профилактики:

  • Проверка instanceof перед кастом
  • Использование дженериков в коллекциях
  • Применение безопасных методов приведения

ConcurrentModificationException

Пакет: java.util

Наследование:

Предназначение: Возникает когда коллекция модифицируется одновременно с итерацией.

Основные условия возникновения:

  • Прямое изменение коллекции во время forEach
  • Параллельное удаление элементов
  • Одновременная модификация нескольким потоком

Пример проявления:

for (String s : list) {
if (s.isEmpty()) {
list.remove(s); // Вызовет исключение
}
}

Решения проблемы:

  • Iterator.remove() вместо list.remove()
  • Создание копии для изменения
  • Использование ConcurrentHashMap

IllegalArgumentException

Пакет: java.lang

Наследование:

Предназначение: Возникает когда метод получает запрещённый аргумент.

Типы некорректных аргументов:

  • Отрицательные значения там где нельзя
  • Пустые строки в критических местах
  • Несоответствие формата входа
  • Недопустимый диапазон параметров

Пример использования:

public void setAge(int age) {
if (age < 0 || age > 150) {
throw new IllegalArgumentException("Неверный возраст");
}
}

Рекомендации:

  • Валидация в начале метода
  • Чёткие сообщения об ошибке
  • Документирование допустимых значений

NumberFormatException

Пакет: java.lang

Наследование:

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

Варианты некорректных вводов:

  • Строки с буквами вместо цифр
  • Неправильный формат десятичных знаков
  • Знаки валют в числовых операциях

Пример проявления:

int value = Integer.parseInt("abc"); // Вызовет исключение

Стратегии обработки:

  • Предварительная проверка символами
  • Использование try-catch блоков
  • Замена на null или значение по умолчанию

NullPointerException

Пакет: java.lang

Наследование:

Предназначение: Возникает при обращению к методу или полю объекта равного null.

Типичные сценарии:

  • Вызов метода на неинициализированном объекте
  • Доступ к свойству нулевого поля
  • Автоматический unboxing null значения
  • Метод возврата null в потоковой цепочке

Пример появления:

String text = null;
int length = text.length(); // Вызовет NPE

Современные подходы:

  • Применение Optional для возвращения значений
  • Валидация параметров в начале метода
  • Использование null-safe операторов в Java 9+

SecurityException

Пакет: java.lang

Наследование:

Предназначение: Возникает когда нарушаются политики безопасности Java.

Основные причины:

  • Попытки несанкционированного доступа к файлам
  • Выполнение запретных операций в песочнице
  • Нарушение разрешений в модульной системе
  • Несовместимость подписи кода

Пример проявления:

Система.setProperty("user.dir", "/etc/"); // Может вызвать

Стратегии защиты:

  • Проверка прав доступа перед действиями
  • Конфигурация Безопасность manager
  • Отказ от опасных методов

Полный справочник по дополнительным важным исключениям

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

IllegalStateException

Пакет: java.lang

Наследование:

Предназначение: Возникает когда метод вызывается в неподходящем состоянии объекта.

Типичные примеры:

  • Вызов метода до инициализации
  • Попытка открытия уже открытого ресурса
  • Нарушение последовательности вызовов
  • Изменение неизменяемых структур

Пример использования:

public void process() {
if (!initialized) {
throw new IllegalStateException("Объект не инициализирован");
}
}

UnsupportedOperationException

Пакет: java.lang

Наследование:

Предназначение: Возникает когда метод не поддерживается реализацией.

Основные сценарии:

  • Реализация интерфейса с фиксированным функционалом
  • Жёстко заданная архитектура типа
  • Защита от несанкционированных изменений

Пример применения:

public class ReadOnlyCollection implements List<String> {
public void add(String s) {
throw new UnsupportedOperationException("Нельзя добавлять");
}
}

ContinuationException (для контекста)

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

Новые возможности:

  • Возможность отмены долгой задачи
  • Явное управление состоянием операций
  • Прозрачность для пользователя системы

Рекомендации:

  • Применяйте при работе с сетевыми запросами
  • Используйте при обработке пользовательских действий
  • Реализуйте в долгосрочных сервисах

Сравнительная таблица категорий исключений

Характеристикаcheckeduncheckederror
Обработка обязательнаДаНетНет
КомпиляцияТребует try/catchНе требуетсяНе требуется
ПримерыIOException, SQLExceptionNullPointerExceptionOutOfMemoryError
ПричинаВнешние ресурсыПрограммная логикаСбой среды
РекомендацияОбрабатывать всегдаИсправлять кодЛогировать

Рекомендации по проектированию обработки исключений

Стратегия определения собственных исключений

УровеньТип исключенияКогда использовать
КритическийCustomExceptionБизнес ошибки
СреднийServiceExceptionСервисные сбои
НизкийApplicationErrorОшибки приложений

Принципы формирования сообщений

  1. Текст сообщения должен быть понятным для читателя
  2. Информация должна содержать идентификаторы для логирования
  3. Сообщение не должно раскрывать внутреннюю структуру системы
  4. Следует избегать технических терминов в пользовательских сообщениях

Практические советы по использованию

  • Не скрывайте исходную причину через generic Exception
  • Всегда добавляйте context в кастомные исключения
  • Документируйте все возможные исключения в javadoc
  • Используйте наследование для категоризации исключений

Инструменты анализа и обработки исключений

Логирование и трекинг

ИнструментНазначениеОбласть применения
SLF4JУниверсальный APIВсе слои архитектуры
LogbackРеализацияProduction окружение
ConsoleОтладкаРазработка окружение

Профилирование и диагностика

Встроенные средства:

  • printStackTrace() для вывода стека
  • getMessage() для извлечения текста
  • getCause() для получения причины
  • getSuppressed() для множественных причин

Внешние инструменты:

  • IDE встроенные отладчики
  • JVM профилеры для анализа
  • Мониторинговые панели observability

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).

Освоение главы0%