Какие типы неудач (failures) существуют в Java и как с ними работать?

«Какие типы неудач (failures) существуют в Java и как с ними работать?» — вопрос из категории Софт-скиллы, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

В Java неудачи представлены иерархией классов Throwable и делятся на два основных типа: исключения (Exceptions) и ошибки (Errors).

1. Исключения (Exception) — проблемы, которые можно и нужно обрабатывать.

  • Checked исключения — компилятор требует явной обработки (через try-catch или throws). Пример: IOException, SQLException.
  • Unchecked исключения (RuntimeException) — не требуют обязательной обработки. Пример: NullPointerException, IllegalArgumentException.

2. Ошибки (Error) — критические системные проблемы, которые обычно не обрабатываются. Пример: OutOfMemoryError, StackOverflowError.

Пример обработки исключения:

try {
    FileInputStream fis = new FileInputStream("file.txt"); // Может выбросить FileNotFoundException
    // Работа с файлом
} catch (FileNotFoundException e) {
    System.err.println("Файл не найден: " + e.getMessage());
    // Логирование или альтернативная логика
} finally {
    // Код для освобождения ресурсов (если они были открыты до блока try)
}

Лучшие практики:

  • Используйте try-with-resources для автоматического закрытия ресурсов, реализующих AutoCloseable.
    try (FileInputStream fis = new FileInputStream("file.txt");
         BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
        // Автоматическое закрытие fis и br
    } catch (IOException e) {
        // Обработка
    }
  • Ловите конкретные исключения, а не общий Exception.
  • Не игнорируйте исключения в пустых блоках catch.
  • Используйте логирование (например, SLF4J) вместо printStackTrace() для записи ошибок.
  • Создавайте собственные, информативные исключения, если стандартные не подходят.