Ответ
Нет, обработка не обязательна, но исключение должно быть объявлено. Ключевое слово throws в сигнатуре метода указывает, что метод может сгенерировать проверяемое (checked) исключение и не обрабатывает его внутри.
Ваши варианты:
- Пробросить дальше: Объявить это же исключение в вызывающем методе.
void caller() throws IOException { callee(); // Метод с throws IOException } - Обработать на месте: Использовать
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) — это твои личные проблемы, объявлять не надо, но если накосячил — получишь по ебалу. Всё просто, как три копейки, ёпта.