← Назад к вопросам
Проверяемое или непроверяемое исключение должен выдать метод при ошибке
1.0 Junior🔥 171 комментариев
#ORM и Hibernate#Spring Boot и Spring Data#Базы данных и SQL
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Проверяемые vs непроверяемые исключения
Определение
Проверяемые исключения (Checked Exceptions) — это исключения, которые компилятор ОБЯЗЫВАЕТ ловить или объявлять в throws. Наследуются от Exception (кроме RuntimeException).
Непроверяемые исключения (Unchecked Exceptions) — RuntimeException и его подклассы. Компилятор не требует их обработки.
Иерархия исключений
Throwable
├── Error (критические ошибки: OutOfMemoryError, StackOverflowError)
├── Exception
│ ├── RuntimeException (непроверяемые)
│ │ ├── NullPointerException
│ │ ├── IndexOutOfBoundsException
│ │ ├── IllegalArgumentException
│ │ └── ...
│ └── Checked exceptions (проверяемые)
│ ├── IOException
│ ├── SQLException
│ ├── FileNotFoundException
│ └── ...
Примеры
// Проверяемое исключение — ДОЛЖЕН обработать
public void readFile(String path) throws IOException {
FileReader reader = new FileReader(path); // throws IOException
// ...
}
// Использование
public static void main(String[] args) {
try {
readFile("file.txt");
} catch (IOException e) {
System.out.println("Ошибка чтения файла");
}
}
// Непроверяемое исключение — обработка опциональна
public void divide(int a, int b) {
int result = a / b; // может выбросить ArithmeticException
}
// Использование — можно без try/catch
divide(10, 2);
Какое использовать?
Используй НЕПРОВЕРЯЕМЫЕ (RuntimeException) когда:
- Программная ошибка — неверные аргументы, логические ошибки
- Невозможно восстановиться — NullPointerException, IndexOutOfBoundsException
- Ошибки разработчика — нарушение контракта
public class UserService {
public void updateUser(User user) {
if (user == null) {
throw new IllegalArgumentException("User cannot be null");
}
if (user.getId() <= 0) {
throw new IllegalArgumentException("Invalid user ID");
}
// обновляем пользователя
}
}
Используй ПРОВЕРЯЕМЫЕ (Exception) когда:
- Внешние ресурсы — файлы, сеть, БД
- Можно восстановиться — повторить попытку, использовать дефолт
- Ожидаемые ошибки — клиент передал неверный файл
public class FileProcessor {
public String readConfig(String path) throws IOException {
// IOException — ожидаемая ошибка при работе с файлами
// Вызывающий код ДОЛЖЕН обработать
try (FileReader reader = new FileReader(path)) {
return reader.readContent();
}
}
}
Best Practices
❌ Плохо — заглушить и молчать:
try {
readFile("config.txt");
} catch (IOException e) {
// молчим, проблему не видно!
}
✅ Хорошо — обработать или пробросить:
try {
readFile("config.txt");
} catch (IOException e) {
throw new RuntimeException("Failed to read config", e);
}
✅ Хорошо — специфичное исключение:
try {
readFile("config.txt");
} catch (FileNotFoundException e) {
logger.warn("Config file not found, using defaults");
return defaultConfig();
} catch (IOException e) {
throw new RuntimeException("Failed to read config", e);
}
Решение
Выбор между checked/unchecked зависит от контекста:
- API методы, работающие с ресурсами → Checked (IOException, SQLException)
- Бизнес-логика, валидация → Unchecked (IllegalArgumentException)
- Критичные операции → Checked, чтобы вызывающий код явно обработал
- Опциональные операции → Unchecked, если ошибка неожиданна