ant*_*npp 0 java exception-handling
我遇到了一些我今天无法向自己解释的事情.在线资源上编写一个将在某些测试中运行的程序是一项小任务.你能否解释一下两种方法之间的区别以及为什么其中一种方法在某些测试中失败(我没有它们).
任务是编写一个静态方法,打开一个连接,然后通过调用它的方法尝试3次与这个连接做一些抽象的东西.问题是您使用的任何方法都可能抛出异常(打开连接和连接方法).您必须尝试完成3次(如果所有尝试都失败 - 抛出异常),另一个条件是必须关闭每个打开的连接.
连接类被调用RobotConnection并实现AutoCloseable.这个类有方法void moveRobotTo(int x, int y)(它是任务中的"做东西方法").你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");
    }
}
在你的第一种方法中,你没有抓住RobotConnectionException.因此,它最多可以失败一次,而不是所需的恰好3次.