Назад к вопросам
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).