Я встретил кое-что, что сегодня не могу объяснить себе. Это была небольшая задача в онлайн-ресурсе для написания программы, которая будет запускаться на некоторых тестах. Не могли бы вы объяснить мне разницу между двумя методами и почему один из них не работает на некоторых тестах (у меня их нет).try-catch in for loop
Задача состоит в том, чтобы написать статический метод, который открывает соединение, а затем пытается 3 раза сделать некоторые абстрактные материалы с помощью этого соединения, вызвав его метод. Проблема в том, что любой используемый вами метод может генерировать исключение (открыть соединение и метод подключения). Вы должны попытаться сделать материал ровно 3 раза (если все попытки не удались - выбросьте исключение), а другое условие состоит в том, что каждое открытое соединение должно быть закрыто.
Класс подключения RobotConnection
и он реализует AutoCloseable
. У этого класса есть метод void moveRobotTo(int x, int y)
(это задача «do stuff» из задачи). Вы можете получить экземпляр RobotConnection
только по телефону RobotConnectionManager.getConnection()
. Методы этих классов могут бросать RobotConnectionException extends RuntimeException
.
Таким образом, реальный вопрос ПРИХОДИТ ЗДЕСЬ:
Этот код не удается (не знаю, почему, по-видимому бесконечный цикл):
public static void moveRobot(RobotConnectionManager robotConnectionManager, int toX, int toY) {
boolean success = false;
for (int i = 0; !success && (i < 3); ++i) {
try (RobotConnection connection = robotConnectionManager.getConnection()) {
connection.moveRobotTo(toX, toY);
success = true;
}
}
if (!success) {
throw new RobotConnectionException("3 attempts failed");
}
}
И этот один был принят в качестве рабочего (я не могу видеть реальную разницу =()
public static void moveRobot(RobotConnectionManager robotConnectionManager, int toX, int toY) {
boolean success = false;
for (int i = 0; !success && (i < 3); ++i) {
try (RobotConnection connection = robotConnectionManager.getConnection()) {
connection.moveRobotTo(toX, toY);
success = true;
} catch (RobotConnectionException e) {}
}
if (!success) {
throw new RobotConnectionException("3 attempts failed");
}
}
Во втором, вы ловите исключение без управления ею ... Bad практика Кстати –