← Назад к вопросам

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

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, если ошибка неожиданна
Проверяемое или непроверяемое исключение должен выдать метод при ошибке | PrepBro