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

Что делает catch?

1.6 Junior🔥 291 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Блок catch: Обработка исключений в Java

Блок catch — это часть механизма обработки исключений (exception handling) в Java, которая позволяет ловить и обрабатывать ошибки, возникающие во время выполнения программы. Он работает вместе с блоком try и является критической частью написания надёжного кода.

Основное назначение catch

Блок catch:

  • Перехватывает исключения, которые возникают в блоке try
  • Предотвращает крах программы при ошибке
  • Обеспечивает контроль над потоком выполнения после ошибки
  • Позволяет логировать и обрабатывать ошибки надлежащим образом

Синтаксис try-catch

try {
    // Код, который может выбросить исключение
    int result = 10 / 0; // ArithmeticException
} catch (ArithmeticException e) {
    // Обработка исключения
    System.out.println(\"Ошибка: деление на ноль\");
    e.printStackTrace();
}

Как работает catch?

  1. try блок выполняется — код выполняется линейно
  2. Возникает исключение — выполнение try прерывается
  3. Поиск подходящего catch — JVM ищет catch блок с соответствующим типом исключения
  4. Выполнение catch — если найден подходящий catch, выполняется его код
  5. Продолжение программы — программа продолжает работу после блока try-catch

Множественные блоки catch

Можно ловить разные типы исключений:

try {
    String text = \"123abc\";
    int num = Integer.parseInt(text);
    int[] arr = {1, 2};
    System.out.println(arr[10]);
} catch (NumberFormatException e) {
    System.out.println(\"Ошибка: некорректный формат числа\");
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println(\"Ошибка: индекс выходит за границы массива\");
} catch (Exception e) {
    System.out.println(\"Неизвестная ошибка\");
}

Multi-catch (Java 7+)

Можно ловить несколько типов исключений в одном catch:

try {
    // Опасный код
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
    System.out.println(\"Ошибка при обработке данных\");
    e.printStackTrace();
}

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

Объект исключения в catch предоставляет полезную информацию:

try {
    int result = Integer.parseInt(\"invalid\");
} catch (NumberFormatException e) {
    // Получение информации об ошибке
    String message = e.getMessage(); // \"For input string: \\\"invalid\\\"\"
    e.printStackTrace(); // Вывод стека вызовов
    
    StackTraceElement[] trace = e.getStackTrace();
    Throwable cause = e.getCause();
}

Try-catch-finally

Блок finally ВСЕГДА выполняется, даже если возникло исключение:

try {
    FileReader reader = new FileReader(\"file.txt\");
    // Чтение файла
} catch (FileNotFoundException e) {
    System.out.println(\"Файл не найден\");
} finally {
    // Выполнится в ЛЮБОМ случае
    System.out.println(\"Блок finally выполнен\");
    // Здесь обычно закрывают ресурсы
}

Иерархия исключений и catch

Порядок catch блоков имеет значение — более специфичные исключения должны быть раньше:

try {
    // Код
} catch (FileNotFoundException e) {
    // ✓ Специфичное исключение (подкласс IOException)
} catch (IOException e) {
    // ✓ Более общее исключение
} catch (Exception e) {
    // ✓ Самое общее исключение
}

Если поменять порядок — код не скомпилируется (unreachable catch).

Try-with-resources (Java 7+)

Автоматическое закрытие ресурсов:

try (FileReader reader = new FileReader(\"file.txt\")) {
    // Работа с reader
} catch (FileNotFoundException e) {
    System.out.println(\"Файл не найден\");
} // reader автоматически закроется

Лучшие практики использования catch

  1. Ловите специфичные исключения — не используйте просто catch (Exception e)
  2. Логируйте информацию об ошибке — для отладки
  3. Не игнорируйте исключения — всегда что-то делайте
  4. Используйте finally для очистки — закрывайте ресурсы
  5. Переводите исключения вверх, если не можете их обработать
public void saveData() throws IOException {
    // Если мы не можем обработать IOException здесь,
    // бросаем его дальше вверх по стеку вызовов
}

Что НЕ делать

// ❌ Плохо: игнорирование исключения
catch (Exception e) {
    // Пусто
}

// ❌ Плохо: использование Exception для всех случаев
catch (Exception e) {
    System.out.println(\"Ошибка\");
}

// ✓ Хорошо: специфичная обработка
catch (SQLException e) {
    logger.error(\"Database error\", e);
    throw new DataAccessException(e);
}

Блок catch — неотъемлемая часть надёжного Java кода, позволяющая контролировать ошибки и обеспечивать стабильность приложения.