JavaRush /Курсы /JAVA 25 SELF /Проброс исключений (throws)

Проброс исключений (throws)

JAVA 25 SELF
11 уровень , 4 лекция
Открыта

1. Введение

В программировании часто бывают ситуации, когда метод сталкивается с ошибкой, но не знает, как её правильно обработать. Например, метод читает файл, но не знает, что делать, если файла нет: спросить пользователя? Завершить программу? Попробовать другой файл? В таких случаях метод может «переложить ответственность» на того, кто его вызвал — то есть «пробросить» исключение дальше по цепочке вызовов.

Проброс исключения — это механизм, позволяющий методу не обрабатывать ошибку самостоятельно, а сообщить вызывающему коду: «У меня тут проблема, решай сам!»

Аналогия: Представьте, что вы — сотрудник колл-центра. Вам звонит клиент с вопросом, на который вы не знаете ответа. Вместо того чтобы гадать, вы говорите: «Секунду, я соединю вас со специалистом». Вы «пробрасываете» вопрос дальше.

Ключевое слово throws: как работает

В Java для проброса исключений используется ключевое слово throws в объявлении метода.

Синтаксис:

тип_возвращаемого_значения имяМетода(...) throws ExceptionType 
{
    // код метода
}

После throws указывается тип исключения, которое может возникнуть в этом методе. Это как предупреждение для других программистов: «Внимание! Этот метод может выбросить исключение такого-то типа. Будьте готовы!»

Пример:

public void readFile(String filename) throws FileNotFoundException 
{
    FileReader reader = new FileReader(filename); // может выбросить FileNotFoundException
    // ...
}

Здесь метод readFile не обрабатывает ошибку сам, а сообщает: «Я могу выбросить FileNotFoundException — пусть тот, кто меня вызвал, решает, что делать».

2. Как вызывающий метод должен реагировать?

Если вы вызываете метод, который объявлен с throws, у вас есть два варианта:

  • Обработать исключение с помощью try-catch
  • Тоже пробросить исключение дальше (добавить throws в свой метод)

Вариант 1: обработать через try-catch

public static void main(String[] args) 
{
    try 
    {
        readFile("data.txt");
    } 
    catch (FileNotFoundException e) 
    {
        System.out.println("Файл не найден: " + e.getMessage());
    }
}

Здесь мы ловим исключение и сами решаем, что делать (например, выводим сообщение пользователю).

Вариант 2: пробросить дальше

public static void main(String[] args) throws FileNotFoundException 
{
    readFile("data.txt");
}

Теперь ответственность за обработку ошибки ложится на того, кто вызовет main (обычно это сама JVM — если ошибка не обработана, программа завершится с сообщением об ошибке).

3. Пример: чтение файла с пробросом исключения

Полный пример с IOException и обработкой на уровне main:

import java.io.*;

public class FileDemo 
{
    // Метод объявляет, что может выбросить IOException
    public static void printFirstLine(String filename) throws IOException 
    {
        BufferedReader reader = new BufferedReader(new FileReader(filename));
        String line = reader.readLine();
        System.out.println("Первая строка: " + line);
        reader.close();
    }

    public static void main(String[] args) 
    {
        try 
        {
            printFirstLine("nofile.txt");
        } 
        catch (IOException e) 
        {
            System.out.println("Ошибка при чтении файла: " + e.getMessage());
        }
    }
}

Метод printFirstLine не знает, что делать, если файла нет — он просто пробрасывает исключение. В main мы ловим ошибку и выводим сообщение.

4. Полезные нюансы

Когда и зачем использовать проброс исключений?

  • Когда метод не может или не должен решать, как обрабатывать ошибку (например, библиотечный код).
  • Когда обработка ошибки зависит от контекста (в одном случае завершить программу, в другом — попробовать другой файл).
  • Чтобы не засорять код лишними try-catch там, где это не нужно.

Best practice: Пробрасывайте исключения, если не можете их обработать осмысленно. Не ловите исключения просто ради галочки!

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

public void process() throws IOException, SQLException 
{
    // ...
}

Checked и unchecked исключения: напоминание

Checked exceptions (например, IOException, SQLException) — компилятор требует их обработки или проброса.

Unchecked exceptions (например, NullPointerException, IllegalArgumentException) — компилятор не требует обработки, их можно не указывать в throws.

5. Типичные ошибки при пробросе исключений

Ошибка № 1: забыли объявить throws для checked-исключения.
Если метод может выбросить checked-исключение, но вы не объявили его в throws и не обработали через try-catch — компилятор выдаст ошибку.

Ошибка № 2: ловите исключение, но не обрабатываете его.
Писать catch (Exception e) {} — плохая практика! Лучше пробросить исключение дальше, если не знаете, что с ним делать.

Ошибка № 3: пробрасываете слишком общий тип.
Если метод может выбросить только FileNotFoundException, не пишите throws Exception — это затрудняет понимание кода.

Ошибка № 4: пробрасываете unchecked-исключения в throws.
Нет смысла писать throws NullPointerException — компилятор этого не требует, и это не помогает обработке ошибок.

1
Задача
JAVA 25 SELF, 11 уровень, 4 лекция
Недоступна
Модуль доступа к секретным документам 📁
Модуль доступа к секретным документам 📁
1
Задача
JAVA 25 SELF, 11 уровень, 4 лекция
Недоступна
Инструмент анализа логов: обработка сбоев чтения 📊
Инструмент анализа логов: обработка сбоев чтения 📊
1
Задача
JAVA 25 SELF, 11 уровень, 4 лекция
Недоступна
Конвейер обработки данных: ожидаемые проблемы с файлом ⚙️
Конвейер обработки данных: ожидаемые проблемы с файлом ⚙️
1
Задача
JAVA 25 SELF, 11 уровень, 4 лекция
Недоступна
Золотая лихорадка: преобразование ввода игрока 💰
Золотая лихорадка: преобразование ввода игрока 💰
Комментарии (14)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
САН САНЫЧ Уровень 19
21 декабря 2025
Проходил старый курс.Вот как раз там тему исключений плохо понял.Здесь все разжевывается.Все стало на 100 % понятно зачем они нужны и как с ними работать.Этот курс конечно по задачам легче.но значительно понятнее.Спасибо разработчикам курса!!
Javahue Уровень 15
3 декабря 2025
Задача: Конвейер обработки данных: ожидаемые проблемы с файлом ⚙️ Не понятно для чего описывать только метод, не обрабатывая throws в main с помощью try-catch. Там ведь он может выкинуть exception по нескольким причинам, если файл не найден или если с ним что-то не так. Ощущение будто не доделал задачу. Сам метод не буду спойлерить, но покажу как обработал несколько exception-ов которые могут выкинуться.

public static void main(String[] args) {
        try {
            extractFirstLineFromData("ЖёсткийJavaПроект.txt");
        } catch (FileNotFoundException e) {
            System.out.println("Файл не найден.");
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("Файл не открывается или поврежден.");
            System.out.println(e.getMessage());
        }
    }
Popka Уровень 24
24 января 2026
Только так нельзя делать. Во-первых, чтобы захватить несколько ошибок возможен только такой вариант: try { } catch (IOException | FileNotFoundException e) { // обработка обоих типов исключений } Во-вторых FileNotFoundException - наследник IOException, а значит можно обработать только IOException.
C0N5P1RACY Уровень 23
22 ноября 2025
Я поражаюсь с задач в этом курсе, сколько было слов о том что тут самые классные задачи, а в итоге мы получаем просто глупое копирование из условий, без каких либо алгоритмов и математики, ничего сложного и думать не надо, просто перепечатал и все, так они еще и умудряются давать такие задачи, в которых есть такие вещи о которых никогда не говорилось ранее, и как решать эти задачи я не пойму. Короче моя личная оценка задачам на этом курсе 1/5, я уже сам на Stepik тренажер с задачами прохожу, лишь бы интерес не упал.
Enofley Уровень 1
3 декабря 2025
Всё тут понятно , вы когда печатаете , хотя-бы что нибудь запомните.
Try_hard Уровень 12
27 декабря 2025
Согласен, чисто клавиатурный тренажер. Хотелось верить, что это будет только на первых уровнях, но, судя по комментариям, так будет на протяжении всего курса.
C0N5P1RACY Уровень 23
27 декабря 2025
На старом курсе с задачами получше
Stanislav Muzulev Уровень 17
13 января 2026
Тут теория хороша дается, я после большого перерыва с удовольствием тут повторяю сейчас все) Алгоритмы эта целая огромная отдельная тема) это тоже самое, что спрашивать почему в этом курсе нет спринга) а если хочешь алгоритмы, для начала есть крутая небольшая книга "Грокаем алгоритмы", которая для начала вообще супер, и потихоньку модешь на литкоде изи задачки проходить, но это только после того, как поймешь хотя бы простые структуры данных) Но еще раз повторюсь, для начала вообще курс кайф, мне уже нетерпится посмотреть. что там в блоках с многопоточкой)
Popka Уровень 24
24 января 2026
Тут дело не в алгоритмах. А в том что задачи должны "бетонировать" теорию. А тут тебе как в ВУЗе просто дают закрепить теорию в виде простых задач. Задачи должны быть реальными - чтобы ты голову ломал как же применить изученную тобой тему чтобы решить проблему. Вот ты изучил try catch, а потом довольный идешь кодить игру или мод и осознаешь что там на практике все совершенно по-другому и твои простые задачи даже близко тебя не приблизили к настоящему пониманию. Это тоже самое как везде в задачах писать PUBLIC, а потом ты разрабатывая игру понимаешь что у тебя везде private final и ты этот публик дай бог пару раз используешь. Задачи должны представлять вызов для тебя.
Gemini Уровень 12
2 ноября 2025
простым языком throws это как повесить табличку на дверь что там может быть опасно если зайдешь сам выкарабкивайся. То есть если видишь метод на котором throws то используя метод ты должен обработать в трай кетч его потому что в самом методе нет обработки а только предупреждение.
Dthmth Уровень 11
26 октября 2025
Тут нигде явно не описано, но throws без обработки не даст скомпилировать программу. По тексту лекции кажется, что это просто информационное сообщение, не более.
Kidze Уровень 21
7 ноября 2025
Буквально в тексте написано два варианта действий с такими методами. Вообще вроде доступно прям подробно объяснили по поводу throws. Вот вся остальная тема немного с трудом воспринимается.
German Malykh Уровень 31
21 сентября 2025
Задача Конвейер обработки данных: ожидаемые проблемы с файлом ⚙️

// Читаем первую строку из файла
String line = bd.readLine();

// Закрываем BufferedReader (он автоматически закроет и FileReader)
bd.close();

// Выводим первую строку на экран (опционально, если требуется)
System.out.println(line);
Mikeysoll Уровень 21
16 ноября 2025
Спасибо. А то непонятно о каких файлах речь, если этого еще не было в программе