Что вернет метод в Java, если catch бросает исключение, а finally содержит return?

«Что вернет метод в Java, если catch бросает исключение, а finally содержит return?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java блок finally выполняется всегда, но если catch бросает исключение, а finally пытается вернуть значение через return, это приведет к ошибке компиляции. Метод не может одновременно бросать исключение и возвращать значение.

Пример с ошибкой компиляции:

String problematicMethod() {
    try {
        int x = 5 / 0;
    } catch (ArithmeticException e) {
        throw new RuntimeException("Error from catch"); // Бросаем исключение
    } finally {
        return "finally"; // ОШИБКА КОМПИЛЯЦИИ: return в finally подавляет исключение из catch
    }
}

Ключевые правила:

  1. Если finally содержит return, это значение становится результатом метода, подавляя любое исключение, выброшенное в try или catch.
  2. Если catch бросает исключение, а finally также содержит throw, будет выброшено исключение из finally (последнее по порядку выполнения).
  3. Компилятор Java предотвращает очевидно проблемные случаи, но логика подавления исключений return в finally — частая причина трудноотлавливаемых багов.

Правильная практика: Избегайте return в блоке finally. Используйте его только для очистки ресурсов.