2015-10-11 12 views
0

Я встретил кое-что, что сегодня не могу объяснить себе. Это была небольшая задача в онлайн-ресурсе для написания программы, которая будет запускаться на некоторых тестах. Не могли бы вы объяснить мне разницу между двумя методами и почему один из них не работает на некоторых тестах (у меня их нет).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"); 
    } 
} 
+0

Во втором, вы ловите исключение без управления ею ... Bad практика Кстати –

ответ

1

Разница в том, что в первом случае вы говорите «открывать и очищать соединение, но я не знаю, как справляться с исключениями: пусть они распространяют цепочку вызовов на то, что может ее обработать»:

try (RobotConnection connection = robotConnectionManager.getConnection()) { 
    // ... 
} 

, тогда как во втором случае, вы говорите, «открытой и очистить соединение, но если происходит исключение, я буду иметь дело с ним самим, действием я буду принимать не делать ничего»:

try (RobotConnection connection = robotConnectionManager.getConnection()) { 
    // ... 
} catch (RobotConnectionException e) {} 
5

В своем первом методе вы не ловите RobotConnectionException. Следовательно, он может не более одного раза, а не требуется точно 3 раза.

+0

Спасибо, что был такой глупый вопрос. Я не могу понять, почему я не видел ответа до того, как задал вопрос = ( – antonpp

+2

@Anton - Это происходит с * всеми нами). Попросить других взглянуть на правильную стратегию. Другие включают в себя переход кода через отладчик и хождение прочь на некоторое время и вернуться со свежим видом –

0

Если исключение RobotConnectionException выбрано в первом фрагменте кода, тогда оно может появиться изнутри инструкции try. Поскольку вы его не поймаете, вам не придется делать три попытки.

Более подробная информация об исключениях Java: http://docs.oracle.com/javase/tutorial/essential/exceptions/