Каковы best practices по использованию исключений (Exception) в Java?

«Каковы best practices по использованию исключений (Exception) в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

1. Выбор типа исключения:

  • Checked Exceptions (Exception): Используйте для ошибок, от которых программа может разумно оправиться, и обработка которых обязательна для вызывающего кода (например, IOException, SQLException).
  • Unchecked Exceptions (RuntimeException): Используйте для ошибок программирования или критических системных сбоев, которые обычно не подлежат восстановлению в месте возникновения (например, NullPointerException, IllegalArgumentException).

2. Правильная обработка и создание:

// ПРАВИЛЬНО: Использование непроверяемого исключения для ошибки валидации
public void setAge(int age) {
    if (age < 0) {
        throw new IllegalArgumentException("Age cannot be negative: " + age);
    }
    this.age = age;
}

// ПРАВИЛЬНО: Обработка проверяемого исключения с логированием и пробросом пользовательского исключения
try {
    Files.readAllBytes(Paths.get("config.json"));
} catch (IOException e) {
    log.error("Configuration file not found", e);
    throw new ApplicationInitializationException("Failed to load config", e); // Обернули в свое
}

3. Что следует избегать:

  • Игнорирование исключений: Пустые catch-блоки.
  • Чрезмерно широкое捕捉: catch (Exception e) без конкретной причины.
  • Использование исключений для логики: Например, использование Exception для выхода из глубоко вложенного цикла.
  • Утечка чувствительной информации: Нельзя передавать детали (стектрейс, имена таблиц) в сообщениях исключений, которые видны пользователю.

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