try catch на каждую строчку или общий

63
31 марта 2022, 21:20

Предположим у нас есть код:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int A = Integer.parseInt(reader.readLine());
int B = Integer.parseInt(reader.readLine());
reader.close();

Получается так, что каждая из трех строчек снизу может вызвать IOException. Я должен завернуть их в один общий try catch или каждую в отдельности, как правильно? P.S. достаточно ли вызвать close только на reader? Типа у нас есть и BufferedReader и InputStreamReader

Answer 1

Для IOException используйте try-with-resources c одним catch:

try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
    int A = Integer.parseInt(reader.readLine());
    int B = Integer.parseInt(reader.readLine());
} catch(IOException ioe) {
    //что-то
}

close писать не нужно, т.к. в этой конструкции reader закрывается автоматически по завершении блока (вместе с InputStreamReader). Если по каким-то причинам нужно использовать обычный try, то reader.close нужно помещать в блок finally, с отделением инициализации reader и проверкой на null.

Не вижу смысла отдельно отлавливать IOException для каждой строки. Если сломается ввод/вывод, то это повлияет на исполнение всего блока.

Другое дело ошибки парсинга (NumberFormatException), которые может выбросить parseInt. Их обработка зависит от того как Вы хотите реагировать на неправильный ввод со стороны пользователя. Если в таком случае нужно вывести ошибку и выйти из программы, то достаточно одного catch. Если нужно перезапросить число, то понадобится и отдельный tryи отдельный цикл и, скорее всего, отдельный метод для ввода.

READ ALSO
Строка imap_body php

Строка imap_body php

Подскажите пожалуйста, есть такой код, которым вывожу письма с gmail

92
Фреймворк Слим не видит контроллер

Фреймворк Слим не видит контроллер

Начал работать с Фреймворком Slim для написания сайта на пхпОднако, столкнулся с проблемой при пройстейшем рутинге

92
Удалить часть строки preg_replace

Удалить часть строки preg_replace

Есть строка https://sitecom/ru/moskov/medceter&page=2 Еще бывает https://site

73
Как переключить уведомления о смене пароля на другую почту?

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

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

199