我遇到了一些我今天无法向自己解释的事情。在线资源上编写一个将在某些测试中运行的程序是一项小任务。你能否解释一下两种方法之间的区别以及为什么其中一种方法在某些测试中失败(我没有它们)。
任务是编写一个打开连接的静态方法,然后尝试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");
}
}
答案 0 :(得分:5)
在您的第一种方法中,您不会抓住RobotConnectionException
。因此,它最多可能失败一次,而不是所需的正好3次。
答案 1 :(得分:1)
不同之处在于,在第一种情况下,您说&#34;打开并清理连接,但我不知道如何处理异常:让它们在调用链中向上传播到可以处理它&#34;:
try (RobotConnection connection = robotConnectionManager.getConnection()) {
// ...
}
而在第二种情况下,你说&#34;打开并清理连接,但如果发生异常,我会自己处理;我将采取的行动是什么都不做&#34;:
try (RobotConnection connection = robotConnectionManager.getConnection()) {
// ...
} catch (RobotConnectionException e) {}
答案 2 :(得分:0)
如果在第一个代码片段中抛出RobotConnectionException,则它可能来自try语句内部。由于你没有抓住它,你不必进行三次尝试。
有关java例外的更多信息:http://docs.oracle.com/javase/tutorial/essential/exceptions/