[英]try-catch in for loop
我遇到了一些我今天無法向自己解釋的事情。 編寫在線程序可以在某些測試上運行,這是在線資源上的一項小任務。 您能否解釋一下兩種方法之間的區別,以及為什么其中一種方法在某些測試中失敗(我沒有這些方法)?
該任務是編寫一個靜態方法來打開一個連接,然后嘗試通過調用其方法3次來對該連接進行一些抽象的處理。 問題是您使用的任何方法都可能引發異常(開放連接和連接方法)。 您必須嘗試正確執行3次操作(如果所有嘗試均失敗-引發異常),並且另一個條件是必須關閉每個打開的連接。
名為RobotConnection
的連接類,它實現AutoCloseable
。 此類具有方法void moveRobotTo(int x, int y)
(這是任務中的“填充方法”)。 您只能通過調用RobotConnectionManager.getConnection()
來獲取RobotConnection
實例。 這些類的方法可以拋出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次 。
區別在於,在第一種情況下,您說“打開並清理連接,但我不知道如何處理異常:讓它們沿調用鏈傳播到可以處理的異常”:
try (RobotConnection connection = robotConnectionManager.getConnection()) {
// ...
}
而在第二種情況下,您說“打開並清理連接,但是如果發生異常,我將自己處理;將采取的措施是不執行任何操作”:
try (RobotConnection connection = robotConnectionManager.getConnection()) {
// ...
} catch (RobotConnectionException e) {}
如果在第一個代碼段中引發了RobotConnectionException,則它可能來自try語句內部。 由於您沒有抓住它,因此您無需進行三次嘗試。
有關Java異常的更多信息: http : //docs.oracle.com/javase/tutorial/essential/exceptions/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.