Sobes.tech
Назад к вопросам
Junior — Middle
78

В каком месте и как передается исключение, если указать его в объявлении метода с помощью ключевого слова throws?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

throws не выбрасывает исключение сам по себе, а только объявляет, что метод может его передать вызывающему коду. Реальное исключение возникает внутри метода через throw или из вызванного кода и затем “всплывает” вверх по стеку, если не обработано. Если на текущем уровне его не перехватили, ответственность за обработку переходит к вызывающему методу.

Определение:

throws в сигнатуре метода — это контракт: метод может завершиться с указанным исключением, и вызывающий код должен быть готов его обработать или тоже объявить дальше. Само исключение не “передается” в момент объявления, а лишь указывается в списке возможных исключений. При выполнении, если исключение действительно возникает и не перехватывается catch, JVM передает его по стеку вызовов наверх.

Пример использования:

public class Demo {
    public static void main(String[] args) {
        try {
            readFile();
        } catch (Exception e) {
            System.out.println("Ошибка обработана в main: " + e.getMessage());
        }
    }

    static void readFile() throws Exception {
        throw new Exception("Файл не найден");
    }
}

Пояснение кода:

Код нужен, потому что вопрос про механизм передачи исключений в Java.

  1. Метод readFile() объявлен с throws Exception, значит он сообщает: внутри может возникнуть Exception, и он не будет обработан здесь.
  2. Внутри метода явно создается и выбрасывается исключение через throw.
  3. Так как в readFile() нет catch, исключение выходит из метода наружу.
  4. В main() это исключение перехватывается в try-catch.
  5. Если бы main() тоже не обработал исключение и не объявил его дальше, программа завершилась бы с ошибкой.

Ключевые моменты:

  • throws — это объявление возможных исключений, а не их создание.
  • Реальное выбрасывание происходит через throw или из кода вызываемых методов.
  • Если исключение не обработано, оно передается вверх по стеку вызовов.
  • Вызывающий метод обязан либо обработать исключение, либо тоже объявить его в throws.
  • throws часто используется для checked exceptions, чтобы заставить вызывающий код явно учитывать ошибку.