Выбор ответа Junior Исключения обновлено

Порядок catch

Вопрос

Почему не скомпилируется этот код?

try {
    read();
} catch (IOException e) {
    log(e);
} catch (FileNotFoundException e) {
    create();
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Второй catch недостижим: IOException уже пойман в первом. FileNotFoundException наследник IOException.

Варианты ответа

  1. Нельзя ловить IOException без throws в методе
  2. Второй catch недостижим: IOException уже пойман в первомправильный ответ
  3. FileNotFoundException нельзя ловить отдельно от IOException
  4. catch-блоки должны быть отсортированы по алфавиту

Разбор

FileNotFoundException наследник IOException. Широкий catch идёт первым и перехватывает всё, второй блок никогда не выполнится, компилятор считает это ошибкой. Узкие исключения ставят выше широких. Ловить IOException без throws можно, наоборот, catch его и обрабатывает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.