Назад к вопросам
Junior
70
questionbank

Расскажи об иерархии исключений в Java.

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

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

  • Error: Представляют серьезные проблемы, от которых приложение обычно не может оправиться (например, OutOfMemoryError, StackOverflowError). Они не предназначены для перехвата и обработки в обычном коде приложения.
  • Exception: Представляют условия, от которых приложение может попытаться восстановиться.
    • RuntimeException: Подкласс Exception, исключения времени выполнения (например, NullPointerException, ArrayIndexOutOfBoundsException). Компилятор не требует их объявления или перехвата (unchecked исключения).
    • Остальные подклассы Exception: Checked исключения (например, IOException, SQLException). Компилятор требует их объявления в сигнатуре метода (throws) или перехвата (try-catch).

Структура иерархии:

Throwable
├── Error
│   ├── LinkageError
│   ├── VirtualMachineError
│   └── ...
│
└── Exception
    ├── RuntimeException
    │   ├── NullPointerException
    │   ├── IndexOutOfBoundsException
    │   └── ...
    └── IOException
        ├── FileNotFoundException
        └── ...
    └── SQLException
    └── ...

Ключевое различие между Error, RuntimeException и checked Exception:

Тип исключения Checked? Что представляет? Примеры
Error Нет Серьезные системные проблемы OutOfMemoryError
RuntimeException Нет Ошибки в логике программы NullPointerException
Checked Exception Да Ожидаемые, но нежелательные события IOException, SQLException

Принцип перехвата:

  • try-catch-finally блоки используются для обработки исключений.
  • Можно перехватывать исключения по их классу. Перехват более общего класса исключений перехватывает и его подклассы.
  • Порядок блоков catch важен: более специфичные исключения должны быть перехвачены раньше более общих.
// Пример обработки исключений
try {
    // Код, который может сгенерировать исключение
    int result = 10 / 0; // Пример ArithmeticException (RuntimeException)
} catch (ArithmeticException e) {
    // Обработка специфичного исключения
    System.err.println("Произошла ошибка деления на ноль: " + e.getMessage());
} catch (RuntimeException e) {
    // Обработка более общего исключения времени выполнения
    System.err.println("Произошла ошибка времени выполнения: " + e.getMessage());
} catch (Exception e) {
    // Обработка любых других Exception
    System.err.println("Произошла общая ошибка: " + e.getMessage());
} finally {
    // Код, который выполняется всегда, независимо от исключения
    System.out.println("Блок finally выполнен.");
}

Создание собственных исключений:

  • Обычно наследуются от Exception (для checked) или RuntimeException (для unchecked).