Нужно ли обрабатывать исключение, если метод объявлен с throws?

Ответ

Нет, обработка не обязательна, но исключение должно быть объявлено. Ключевое слово throws в сигнатуре метода указывает, что метод может сгенерировать проверяемое (checked) исключение и не обрабатывает его внутри.

Ваши варианты:

  1. Пробросить дальше: Объявить это же исключение в вызывающем методе.
    void caller() throws IOException {
        callee(); // Метод с throws IOException
    }
  2. Обработать на месте: Использовать try-catch в вызывающем методе.
    void caller() {
        try {
            callee();
        } catch (IOException e) {
            // Обработка
        }
    }

Для непроверяемых исключений (RuntimeException) использование throws не требуется и носит лишь документационный характер.

Ответ 18+ 🔞

А, слушай, ну это ж классика, блядь! Ситуация, как с Герасимом и его Муму — либо топить, либо не топить, третьего не дано, ёпта!

Вот представь: пишешь ты свой метод, а он такой — «а я, сука, могу кинуть IOException». И ты стоишь перед выбором, как тот самый Герасим, блядь. Либо ты, падла, берёшь ответственность на себя и говоришь: «Ладно, я сам разберусь, блядь!» — и оборачиваешь вызов в try-catch. Либо ты, хитрая жопа, делаешь вид, что это не твои проблемы, и кричишь всем вышестоящим: «Эй, предупреждаю, тут исключение летит, ловите его, блядь!» — и пишешь throws в сигнатуре своего метода.

// Вариант 1: Сам разберусь, как взрослый (обработка)
void caller() {
    try {
        callee(); // Метод, который может наебнуться
    } catch (IOException e) {
        // Ну, тут либо логируем, либо плачем, либо делаем вид, что так и надо
        e.printStackTrace(); // Классика жанра, блядь
    }
}

// Вариант 2: Не моя проблема, пусть другие парируются (проброс)
void caller() throws IOException {
    callee(); // Я просто предупредил, что отсюда тоже может вылететь!
}

А вот с RuntimeException — это вообще отдельная песня, блядь. Это как если бы Муму была не собачкой, а каким-нибудь ёбаным полтергейстом, который материализуется из ниоткуда. Тебя никто не заставляет заранее объявлять, что у тебя в доме может завестись полтергейст. Но если он объявится — всем пиздец. Поэтому throws для них — это просто такая вежливая записка на холодильнике: «Внимание, тут иногда летают тапки, блядь». Не обязательна, но иногда полезно, чтобы другие не охуели от неожиданности.

Короче, суть в чём: checked исключения (IOException и им подобные) — ты обязан либо поймать, либо объявить, что они могут вылететь. А unchecked (RuntimeException) — это твои личные проблемы, объявлять не надо, но если накосячил — получишь по ебалу. Всё просто, как три копейки, ёпта.