Все разделы
Выбрать школу

Школа. Увлечения. Большое будущее.

PROSCHOOLS · ОБРАЗОВАНИЕ РЯДОМ

Ваш город

Выберите город, чтобы находить образование и возможности рядом.

Как учитываем городКаталог и кнопки «Выбрать школу» покажут школы выбранного города.Онлайн-курсы, учебник, ГДЗ и задания к экзаменам доступны по всей России.

Популярные города

Будет выбран: Вся Россия

Учебные материалы останутся прежними.

Поиск по сайту

По всему сайтуШколы выбранного города — выше в результатах

С чего начнём?

↑ ↓ — выбрать результат · Enter — открыть · Esc — закрыть

try, catch и finally в Java: как обрабатывать исключения

💻 Информатика · 10 класс

Порядок выполнения, выбор обработчика и отличие ошибки данных от скрытого сбоя.

Клавиатура в компьютерном классе
Иллюстрация к предмету «Информатика»Hmartil · Wikimedia Commons · CC BY-SA 4.0

Что происходит при исключении

Исключение прерывает обычное выполнение текущего участка кода. Java ищет подходящий обработчик по типу объекта исключения. Блок try обозначает защищаемую последовательность действий, catch — обработку конкретного типа, finally — завершающие действия при обычном выходе и при большинстве выходов из-за исключения.

Обработчик не продолжает выполнение с той строки try, которая завершилась неудачно. Если исключение перехвачено, управление идёт после соответствующей конструкции.

Разобранный пример

String text = "12x";
try {
    int value = Integer.parseInt(text);
    System.out.println(value * 2);
} catch (NumberFormatException ex) {
    System.out.println("Not an integer");
} finally {
    System.out.println("Finished");
}

Будут напечатаны Not an integer и Finished. Преобразование "12x" в int не удалось; строка с удвоением не выполнится. Если заменить вход на "12", появятся 24 и Finished; catch тогда пропускается. Это две разные ветви выполнения, которые стоит проверять отдельно.

Несколько обработчиков

Если нужны разные реакции, пишут несколько catch. Более конкретный тип ставят перед общим: после catch (Exception ex) нельзя добавить достижимый catch для его подкласса. Общий обработчик уже перехватил бы такие объекты. Не следует ловить Exception по привычке, когда программа умеет осмысленно обрабатывать только неверную запись числа.

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

Оговорки о finally

Finally обычно выполняется и при return из try, однако говорить «выполняется абсолютно всегда» нельзя: принудительное завершение процесса или остановка виртуальной машины меняют ситуацию. Возвращать значение из finally опасно ещё и потому, что такой return может подавить прежний результат или исключение. Для закрываемых ресурсов предпочтительнее специальная конструкция try-with-resources.

Задания

  1. Какие строки примера выполнятся при text = "5"?
  2. Можно ли поставить catch (RuntimeException ex) после catch (Exception ex)?
  3. Почему пустой обработчик NumberFormatException не превращает вход "12x" в корректное число?

Ответы

1. Преобразование успешно, печатаются 10 и Finished; сообщение catch отсутствует. 2. Нет: более общий Exception уже покрывает RuntimeException, поэтому такой обработчик недостижим. 3. Исключение лишь перехвачено; значение не получено, исходная операция не возобновляется автоматически.

Частая ошибка

Не используйте исключения для маскировки неправильного алгоритма. Сначала определите ожидаемую ошибочную ситуацию и реакцию на неё. Например, целочисленное деление на ноль вызывает ArithmeticException, но это не доказывает, что любое вычисление с нулём в Java ведёт себя так же: арифметика float и double имеет другие правила.

В хорошем обработчике читатель видит, какая операция не удалась, что программа теперь знает и какие действия ещё допустимы. Сообщение «что-то пошло не так» без этой связи редко помогает исправить ввод или восстановить работу.

Связанные материалы

Источники и материалы