Что вернет метод, если в try произойдет деление на 0, catch вернет «error», а finally вернет «finally»?

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

Ответ

Метод вернет строку "finally". Ошибки компиляции не будет.

Пояснение:

  1. int x = 5 / 0; выбросит ArithmeticException.
  2. Блок catch перехватит исключение и выполнит return "error";.
  3. Однако блок finally выполняется всегда, даже если в try или catch уже был выполнен return. Если finally содержит свой return, именно его значение станет результатом всего метода, переопределив возвращаемое значение из catch.
public static String test() {
    try {
        int x = 5 / 0; // ArithmeticException!
        return "try";
    } catch (Exception e) {
        return "error"; // Этот return будет «перезаписан»
    } finally {
        return "finally"; // Метод вернет это значение
    }
}

System.out.println(test()); // Вывод: finally

Важно: Использование return в finally считается плохой практикой, так как «маскирует» исключения и возвраты из try/catch, что затрудняет отладку.